Выбор - строгая сестра сортировки (повторите это десять раз подряд).Алгоритмы выбора менее известны, чем алгоритмы сортировки, но тем не менее полезны.
Вы не можете сделать лучше, чем O (N ^ 2) (в N), поскольку ничто не указывает на то, что вы не должны посещать каждый элементмассив.
Хорошим подходом является сохранение очереди приоритетов , состоящей из М самых больших элементов.Это делает что-то O (N x N x log M).
Вы пересекаете массив, ставя в очередь пары (элементы, индекс) по мере продвижения.В очереди сохраняются элементы, отсортированные по первому компоненту.
Как только в очереди есть M элементов, вместо того, чтобы ставить вас в очередь:
- Запросите элемент min очереди
- Если текущий элемент массива больше, вставьте его в очередь и отбросьте элемент min очереди
- В противном случае ничего не делайте.
Если M больше, сортировкамассив является предпочтительным.
ПРИМЕЧАНИЕ: @ Энди Финкенштадт делает хорошее замечание (в комментариях к вашему вопросу): вам определенно следует пройтись по массиву в «направлении локальности данных»: makeубедитесь, что вы читаете память непрерывно.
Кроме того, это тривиально распараллеливается, единственная непараллелизуемая часть - это когда вы объединяете очереди при присоединении к подпроцессам.