2017-01-29 12 views
0

配列内で2番目に大きい番号を探しようとしています。このコードはなぜ機能しないのですか?リストから2番目に大きいNSMutableArray要素を比較します

NSMutableArray *array1=[[NSMutableArray alloc]initWithObjects:@5,@25,@48,@2,@52,@53, nil]; 
id temp,larg2;int k=0;  

while(k<2) 
{ 

    for(int j=0;j<5-k;j++) 
    { 

      if([array1 objectAtIndex:j]>[array1 objectAtIndex:j+1]) 
     { 
      temp=[array1 objectAtIndex:j]; 
      [array1 replaceObjectAtIndex:j withObject:[array1 objectAtIndex:j+1]]; 
      [array1 replaceObjectAtIndex:j+1 withObject:temp]; 
     if(k==1 && j==3). //this statement is not running?? 
     { larg2=temp; 
      NSLog(@"The answer is %@",larg2); 
     } 
     } 
    } 
    k++; 

} 

    NSLog(@"The value of Second Largest Element is %@",larg2); 

} 

2番目に大きな要素を見つけるにはどうすればよいですか?

+0

二番目に大きい要素を見つけることができませんでした???? –

答えて

2

最初にNSSetを作成してから重複を除外し、次に降順に配列をソートし、2番目の要素を選択します。並べ替えなし

NSArray * unsortedArray = @[@22,@11,@53,@15,@7,@37,@11,@92,@84,@5]; 
NSSet *numberSet = [NSSet setWithArray: unsortedArray]; 
NSArray *sortedNumbers = [[numberSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:NO] ]]; 
NSNumber *secondHighest; 
if ([sortedNumbers count] > 1){ 
     secondHighest = sortedNumbers[1]; 
    } 
NSLog(@"%ld", secondHighest); 

:あなたは、配列の小さなセットを持っている場合は

NSInteger max1 = -1, max2 = -1; 
for (NSInteger i = 1; i < [unsortedArray count]; ++i) { 
     if ([unsortedArray[i] integerValue] > max1) { 
      max2 = max1; 
      max1 = [unsortedArray[i] integerValue]; 
     } else if ([unsortedArray[i] integerValue] > max2 && [unsortedArra1y[i] integerValue] < max1) { 
      max2 = [unsortedArray[i] integerValue]; 
     } 
    } 
NSLog(@"%ld %ld",max1, max2); 

は、あなたは、配列をソートするソート方法を使用することができますが、要素の数が多いために、それは数の増加とより多くの時間がかかりますパフォーマンスが非常に悪いO(n^2)、第2の方法は単純でパフォーマンスO(n)です。

+1

あなたの答えは私と全く同じです。しかし、sortUsingDescriptorsのようなシステムソートメソッドは、O(n^2)のパフォーマンスより優れている傾向があります。通常、それらは最悪の場合としてO(n^2)を伴うO(n log n)性能を与える。また、記述子ベースのメソッドは、 'sortedArrayUsingComparator'のようなコンパイラベースのメソッドよりも遅くなる傾向があります。なぜなら、非常に一般的なソートのために構築されており、KVOを使用して配列要素から値を抽出するからです。コンパイラベースのメソッドでは、KVOのオーバーヘッドなしで直接配列要素の値を比較するコードを書くことができます –

+0

はい。あなたは正しく 'sortedArrayUsingComparator''はn-1回の比較を行い、各要素は大部分のlog n回の比較に含まれます。 –

+0

@GurpreetSingh、Siddheshの「並べ替えなし」は、最良の解決策のための作業コードです。コピー/ペーストコードを使用する場合は、それを使用してください。 –

3

必要なものが2番目に大きなもので、使用している並べ替えアルゴリズムが非常に悪い(O(n^2)の性能を持つ、つまり速度が遅くなる)場合は、配列を並べ替える必要はありませんアイテム数の2乗で、数百アイテムで完了するまでに時間がかかり、数千アイテムでハングアップするように見えます)

したがって、実際のポイントはありませんあなたのコードをデバッグしようとしています。それは、表現が進むにつれて "豚に口紅をかける"のです。

アレイをソートする代わりに、アレイを1回パスします。変数largestsecondLargestを設定します。現在の配列の項目が最大値より大きい場合は、largestsecondLargestより大きいかどうかを確認し、secondLargestを置き換えて、largestを新しい最大値に置き換えます。これは、O(n)のパフォーマンス(完了までの時間が配列内のアイテムの数に比例して増加する)をもたらします。これは最速のソートアルゴリズムより速く、実装するのがはるかに簡単です。

パフォーマンスについて気にしない場合は、システムソート方法を使用して、ソートされた配列の最後の2番目の項目を取ります。システムのソート関数は最適化されており、通常はソートアルゴリズムに非常に優れたO(n log n)のパフォーマンスを持っています。

1

は試してみてください、この1

NSArray *arr = [[NSArray alloc]initWithObjects:@20,@12,@24, nil]; 
NSSet *tempSet = [NSSet setWithArray: arr]; 
NSArray *arr1 = [[tempSet allObjects] sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES] ]]; 
NSLog(@"%@",[arr1 objectAtIndex:1]); 
関連する問題