Целочисленные порядки в возрастающем и убывающем порядке - PullRequest
0 голосов
/ 24 октября 2010

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

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

Ответы [ 5 ]

2 голосов
/ 24 октября 2010

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

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

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

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

1 голос
/ 24 октября 2010

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

  1. Алгоритмы сортировки в Википедии .
  2. sorting-algorithms.com . Содержит приятное объяснение с анимацией.

А если вас особенно интересует цель-c, проверьте раздел Сортировка ссылки NSArray . Здесь содержится пример для сортировки массива целых чисел.

0 голосов
/ 24 октября 2010

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

0 голосов
/ 24 октября 2010

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

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

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

0 голосов
/ 24 октября 2010

Просто отсортируйте массив в порядке возрастания (я не использую цель 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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...