Существует еще один алгоритм для вычисления статистики k-го порядка на основе структуры данных soft heap , которая является вариантом стандартной очереди приоритетов, которой разрешено «искажать» некоторое числоиз приоритетов он хранит.Алгоритм более подробно описан в статье в Википедии, но основная идея состоит в том, чтобы использовать мягкую кучу для эффективного (O (n) времени) выбора центра для функции разделения, которая имеет гарантию хорошего разделения.В некотором смысле, это просто модифицированная версия алгоритма медианы медиан, которая использует (возможно) более простой подход к выбору элемента pivot.
Мягкие кучи не особенно интуитивны, но естьдовольно хорошее описание их доступно в этой статье («Более простая реализация и анализ мягких куч Хазелля»), которая включает в себя формальное описание и анализ структуры данных.
Однако, есливам нужен действительно быстрый алгоритм O (n) в худшем случае, рассмотрите возможность introselect .Этот алгоритм на самом деле довольно блестящий.Он начинается с использования алгоритма быстрого выбора , который неинтеллектуально выбирает стержень и использует его для разделения данных.На практике это очень быстро, но в худшем случае.Introselect исправляет это, отслеживая внутренний счетчик, который отслеживает его прогресс.Если алгоритм когда-либо выглядит так, что он собирается ухудшиться до времени O (n 2 ), он переключает алгоритмы и использует что-то вроде медианы медиан, чтобы гарантировать гарантию наихудшего случая.В частности, он следит за тем, сколько массива отбрасывается на каждом шаге, и если некоторое некоторое количество шагов происходит до того, как половина входных данных отбрасывается, алгоритм переключается на алгоритм медианы медиан, чтобы убедиться, что следующий стержень хорош передзатем перезапустите, используя быстрый выбор.Это гарантирует время O (n) в худшем случае.
Преимущество этого алгоритма в том, что он чрезвычайно быстр на большинстве входов (поскольку быстрый выбор очень быстр), но имеет отличное поведение в худшем случае.Описание этого алгоритма, а также связанный с ним алгоритм сортировки, можно найти в этой статье («Алгоритмы самоанализа и сортировки»).
Надеюсь, этопомогает!