Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Несколько максимальных чисел из массива (https://javascript.ru/forum/dom-window/71017-neskolko-maksimalnykh-chisel-iz-massiva.html)

ChayNik 19.10.2017 14:50

Несколько максимальных чисел из массива
 
Подскажите, пожалуйста, можно ли вывести несколько макс. чисел по типу

var arr = [15, 8, 47, 19, 23],
    max = Math.max.apply(null, arr);
    alert(max);


???

laimas 19.10.2017 14:53

ChayNik,
отсортируйте массив по убыванию и возьмите его срез нужно размера. Можно сортировать и по возрастанию, но срез получать с конца массива.

Nexus 19.10.2017 14:57

Цитата:

Сообщение от laimas
ChayNik,
отсортируйте массив по убыванию и возьмите его срез нужно размера. Можно сортировать и по возрастанию, но срез получать с конца массива.

Гениально, я не догадался, что так можно сделать.

laimas 19.10.2017 14:58

Nexus,
ну а как еще можно? Я другого даже и не представляю. :)

Nexus 19.10.2017 15:03

Цитата:

Сообщение от laimas (Сообщение 467768)
Nexus,
ну а как еще можно? Я другого даже и не представляю. :)

Способов несколько, но они кривоватые.
Ваш способ самый правильный.

laimas 19.10.2017 15:04

Цитата:

Сообщение от Nexus
Способов несколько

перебор циклом и поиск? Это же сразу отпадает так как бессмысленно.

Nexus 19.10.2017 15:06

Цитата:

Сообщение от laimas (Сообщение 467770)
перебор циклом и поиск? Это же сразу отпадает так как бессмысленно.

Поиск необязателен, можно 1 раз пробежаться по массиву сохранив N наибольших значений.

laimas 19.10.2017 15:35

Цитата:

Сообщение от Nexus
сохранив N наибольших значений

Сами то они в очередь на сохранение не станут, нужно сравнение, а это и есть найти.

Alexandroppolus 19.10.2017 16:08

если массив не особо крупный, то можно остановиться на варианте с сортировкой (O(n*ln(n)) и не морочить себе голову. :)

а так - вариант с перебором достигает почти линейной сложности. В худшем случае это будет O(n*ln(k)), где k - сколько макс. элементов надо выбрать. Для этого надо использовать "кучу", в которой держать выбранные наибольшие элементы. Если ещё и сохранять наименьший выбранный элемент, то (когда уже выбрали k элементов), можно предварительно сравнивать с ним, тогда примерно в половине итераций кучу трогать не понадобится.

ChayNik 19.10.2017 21:40

Спасибо большое :)


Часовой пояс GMT +3, время: 16:30.