--
Michael Antipin
--
Michael Antipin
Если академическая, то читать источники по алгоритмам и структурам данных.
Если практическая -- то не париться, а отсортировать массив и взять N
первых элементов. Если важно сохранить изначальную позицию элементов в
массиве, то клонировать массив и сортировать клон.
// sorted array of max n elements
var max:Array = [];
for (var i:int = 0; i < a.length; i++) {
if (max.length < n || a[i] > max[0]) {
// look for index to insert
var j:int = max.length < n ? 0 : 1;
while (j < max.length && max[j] < a[i]) {
j++;
}
// adding element into sorted array
if (j == max.length && j < n) {
max[j] = a[i];
} else {
max.splice(j, 0, a[i]);
if (max.length > n) {
max.splice(0, 1);
}
}
}
}
Если коротко: создаем структуру "сортированный список", в которой
будем хранить текущий список N максимальных элементов. Проходимся по
нашему масиву и добавляем элемент в сортированый список, если длинна
списка < n или если текущий элемент больше минимального в списке.
> Если академическая, то читать источники по алгоритмам и структурам данных.
ближайшее, что нашёл - http://en.wikipedia.org/wiki/Selection_algorithm
- но оно не совсем то
> Если практическая -- то не париться, а отсортировать массив
не очень удобно, т.к. массив как бы пул, в конце м.б. куча элементов,
которые не нужно учитывать
остальные ответы ещё почитаю, спасибо
>> Если практическая -- то не париться, а отсортировать массив
> не очень удобно, т.к. массив как бы пул, в конце м.б. куча элементов,
> которые не нужно учитывать
А если у тебя массив - пул
то сразу же переписывай и ввесто массива юзай кучу
и сортировать не придется берешь себе с верху кучи N нужных элементов
Я там сверху, в третьем сообщении, об этом написал, назвав это пузырьком. :)
А вообще сортировать никто не просил, так что все сводится к пробегам
со сравнениями _без перестановок_. Просили же только _найти_, зачем
сортировать?
N раз пробежатся по массиву, отыскивая наибольший элемент.
Это можно реализовать за полторы минуты.
Если под пивом -- то за десять (дебаг затягивается).
Что тут еще обсуждать? :)
Если
-- в массиве больше хотя бы 10к элементов,
-- и поиски происходят очень часто,
то тогда можно что-то выдумывать.
А что выдумывать -- уже подсказали много раз: взять какой-то алгоритм
сортировки, который правильно сортирует часть массива на каждом шаге,
и его укоротить.
--
Michael Antipin
> >> Если практическая -- то не париться, а отсортировать массив
> > не очень удобно, т.к. массив как бы пул, в конце м.б. куча элементов,
> > которые не нужно учитывать
>
> А если у тебя массив - пул
> то сразу же переписывай и ввесто массива юзай кучу
> и сортировать не придется берешь себе с верху кучи N нужных элементов
мне немножко стыдно, но я не знаю, что такое куча :( судя по тексту,
имеется ввиду изначально вставлять в порядке убывания/возрастания, но
я уже отписался что это не хороший вариант, т.к. при заполнении
элементы часто перезаписываются (т.е. используется их первоначальный
порядок).
если интересно, вообще речь идёт о нахождении N длиннейших сторон в
выпуклой оболочке (ух ты ж термин, не знал что оно так на русском)
ну так и сделал сначала, но мало ли, вдруг магическим образом можно
сделать за один проход, "а пацаны-то и не знают"... решил спросить.
я помню, это из твоей ссылки про пирамидальную сортировку, но там ещё
подготовительный этап ;) и в статье прямо пишут:
> Недостатки: Сложен в реализации.
Ну да куча это такой _сортированный_ особо упорядоченный массив
Ну если уж тебе так надо сохранить этот исходный массив то юзай
паралельно и массив и кучу
потеряешь немного памяти и пару миллисекунд на вставке/удалении/изменении
зато всегда есть Н наибольших элементов
а если у тебя всетаки во много раз чаще происходят изменения в этом
массиве чем возникает необходимость поиска
то оставляй как сделал
Подготовительный этап это и есть построение кучи из массива
Если не будешь сбрасывать/удалять кучу, то нинидо никаких тебе
подготовительных операций
куча(массив/биннарное дерево) всегда есть и всегда упорядоченное (сортированное)
потери только на вставке/удалении/изменении но это быстро и не затратно