2017-01-29 3 views
0

Я пытаюсь найти второе по величине число в массиве. Почему этот код не работает?Сравните элементы 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); 

} 

Как найти второй по величине элемент?

+0

Не удалось найти второй по величине элемент ???? –

ответ

2

Сначала создайте NSSet, если вам нужно исключить дубликаты, а затем отсортируйте по убыванию, выберите второй элемент.

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) и второй метод прост и производительность O (n).

+1

Ваш ответ и мой очень похожи. Однако методы сортировки системы, такие как sortUsingDescriptors, имеют тенденцию работать лучше, чем O (n^2). Обычно они дают O (n log n) производительность, а O (n^2) - наихудший. Кроме того, методы на основе дескрипторов имеют тенденцию быть медленнее, чем методы на основе компаратора, такие как 'sortedArrayUsingComparator', поскольку они созданы для очень общей сортировки и используют KVO для извлечения значений из элементов массива. С помощью методов на основе компаратора вы можете написать код, который сравнивает значения элементов массива напрямую без накладных расходов KVO –

+0

Да. Вы правы 'sortedArrayUsingComparator'' принимает n-1 сравнения, и каждый элемент участвует в сравнении не более log n раз. –

+0

@GurpreetSingh, «Без сортировки» Сиддеша - это рабочий код для лучшего решения. Если вы хотите скопировать/вставить код, используйте это. –

3

Нет необходимости сортировать массив, если все, что вам нужно, это второй по величине элемент, а алгоритм сортировки, который вы используете, очень низок (он имеет производительность O (n^2), что означает, что он будет медленнее с квадратом числа предметов, так что всего за несколько сотен штук он начнет занимать много времени, и с несколькими тысячами предметов он, похоже, повесится.)

Таким образом, нет реальной точки в попытке отладить ваш код. Это выражение «помады на свинье», как выражение.

Вместо сортировки массива выполните один проход через массив. Установите переменную largest и secondLargest. Если текущая запись массива больше наибольшей, проверьте, больше ли largest, чем secondLargest, и замените secondLargest, а затем замените largest с новым самым большим значением. Это даст вам производительность O (n) (время до завершения линейно растет с количеством элементов в массиве), которое быстрее, чем алгоритмы быстрого сортировки, а также намного проще реализовать.

Если вы не заботитесь о производительности, просто используйте метод сортировки системы, а затем возьмите второй-последний элемент в отсортированном массиве. Функции сортировки системы оптимизированы и, как правило, имеют производительность O (n log n), что неплохо для алгоритмов сортировки.

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]);