2010-10-24 3 views
0

Я работаю с Objective-C, но, вероятно, для этого не имеет значения язык программирования. Таким образом, в основном у меня есть массив, скажем, целые числа 12, 5 и 17, и я хочу иметь возможность вытащить наибольшее число или самый маленький или второй наименьший и т. Д.Целые числа заказов в порядке возрастания и убывания

В основном я хочу иметь возможность сортировать их по возрастанию или убыточному порядку, чтобы я мог выбрать, например, второе наименьшее число, извлекая objectAtIndex: 1, если он отсортирован в порядке возрастания. Я чувствую, что это невероятно очевидно, но я не могу придумать, как это сделать в данный момент, поэтому мне бы это понравилось, если бы кто-нибудь мог просветить меня.

ответ

2

Если у вас есть NSArray с NSNumber экземпляров, то сорт вы ищете так просто, как это:

NSArray* sortedNumbers = [unorderedNumbers sortedArrayUsingSelector:@selector(intValue)]; 

Это будет сортировать по возрастанию, так [sortedNumbers lastObject] будет наибольшим значением.

Есть еще несколько методов сортировки по NSArray, если у вас есть более конкретные потребности. NSArray sorting

+0

Я пробовал код, который вы опубликовали, и он просто не работал. Не было никаких синтаксических ошибок или предупреждений, но ничего не произошло, порядок остался прежним, поэтому я не знаю, что с ним происходит. – Regan

+0

@Regan: Обратите внимание, что 'sortedArrayUsingSelector:' не сортируется на месте. Он возвращает новый массив с отсортированными значениями, исходный массив остается нетронутым. – PeyloW

+0

Да, я знаю, я скопировал ваш точный код, но я все равно пошел с описанным здесь способом: http://stackoverflow.com/questions/1844031/how-to-sort-nsmutablearray-using-sortedarrayusingdescriptors – Regan

0

Просто сортирует массив в порядке возрастания (я не использую Objective C, но я уверен, что есть функция для этого), а затем получить элемент, куда вы хотите ...

Чтобы получить самый большой

array[array.length - 1] 

Второй по величине

array[array.length -2] 

Наименьший

array[0] 

Второй маленький

array[1] 

Вы должны проверить, чтобы убедиться, что индекс массива допустима:

if (array.length - 2> 0) //Second largest element 

    return array[array.length - 2]; 

Или:

if (array.length > 1) //Second smallest element 

    return array[1]; 

Смотрите здесь, как отсортировать массив в цель C:

http://howtomakeiphoneapps.com/2009/03/how-to-sort-an-array-in-objective-c/

0

Если вы хотите сохранить порядок исходного массива, одним из методов является создание второго массива, который просто содержит числа 0, 1, ... n, представляющие индексы в первом массиве. Затем сортируйте второй массив, но вместо сравнения его значений сравните соответствующие значения, которые он указывает в первом массиве. (Вы также можете просто сохранить указатели и отсортировать их на основе указателей с разыменованием.)

Затем, чтобы найти второе по величине число, найдите индекс во второй-последней позиции во втором массиве и посмотрите, где он указывает в первом массиве.

Если вы хотите получить фантазию и не сортировать, this lecture описывает алгоритм нахождения k-наибольшего элемента в линейном времени. Я на самом деле не использовал его, но похоже, что это хороший метод, если ваши данные часто меняются, так как вам не нужно поддерживать дополнительный массив.

1

Практически каждый язык высокого уровня, включая объектив-c, имеет библиотеку для сортировки массива. Но, как вы сказали, язык не имеет значения, возможно, вы ищете сам алгоритм. Существует ряд алгоритмов сортировки с различной вычислительной сложностью. Вы можете найти их в любой стандартной книге алгоритмов. Или эти 2 страницы могут быть полезны:

  1. Sorting Algorithms in Wikipedia.
  2. sorting-algorithms.com. Содержит хорошее объяснение с анимацией.

И если вас интересует, в частности, цель-c, проверьте Sorting section of NSArray reference. Он содержит пример сортировки массива integer.

0

Если ваша цель состоит в том, чтобы получить наибольшее число или самое низкое, или второе-самое низкое, или то, что у вас есть, и вам нужно только одно число из результата, сортировка будет излишней. Вместо этого вы должны просто перебирать весь массив и отслеживать наивысшее (или самое низкое, или самое низкое (для второго по величине)) число, которое было просмотрено до сих пор. Если ваш язык поддерживает это, он будет называться «сгибом». Единственная причина для фактического сортировки массива состоит в том, что вам нужно получить доступ к нескольким различным ранжированным значениям из массива.

Смежные вопросы