То, что вы имеете в виду, это алгоритм выбора, как отмечалось ранее. В частности, ваша ссылка на быструю сортировку предполагает, что вы думаете о выборе на основе раздела .
Вот как это работает:
- Как и в Quicksort, вы начинаете с выбора хорошего
Pivot: то, что вы думаете, почти
на полпути через ваш список. Затем вы
просмотреть весь список предметов
обмениваясь вещами взад и вперед, пока
все предметы меньше, чем ваш опорный пункт
находятся в начале списка, и
все вещи больше твоего центра
в конце. Ваш центр уходит в оставшееся место посередине.
- Обычно в быстрой сортировке вы бы рекурсировали
по обе стороны от оси, но для
Алгоритм выбора вы будете только
рекурс на стороне, которая содержит
индекс, который вас интересует. Итак, если
Вы хотите найти третий самый низкий
ценность, рекурс на любой стороне
содержит индекс 2 (потому что индекс 0
1-е самое низкое значение).
- Вы можете прекратить повторение, когда вы
сузил регион только до одного
индекс. В конце у вас будет один
несортированный список самых маленьких "m-1"
объекты, и еще один несортированный список "n-m" крупнейших
объекты. «М» -й объект будет промежуточным.
Этот алгоритм также хорош для поиска отсортированного списка самых высоких m элементов ... просто выберите m самый большой элемент и отсортируйте список над ним. Или, для алгоритма, который немного быстрее, используйте алгоритм быстрой сортировки, но отклонитесь от рекурса в области, не перекрывающие область, для которой вы хотите найти отсортированные значения.
По-настоящему изящная вещь в этом заключается в том, что он обычно выполняется за O (n) времени. В первый раз он видит весь список. При первой рекурсии он видит около половины, затем одну четверть и т. Д. Итак, он просматривает около 2n элементов, поэтому он выполняется за O (n) времени. К сожалению, как и в случае быстрой сортировки, если вы последовательно выбираете плохую точку, вы будете работать за O (n 2 ).