Поиск k-ой порядковой статистики
Эта статья находится в разработке!
Определение: |
-ой порядковой статистикой набора элементов линейно упорядоченного множества называется такой его элемент, который является -ым элементом набора в порядке сортировки |
Модификация QuickSort
Описание алгоритма
Будем использовать процедуру рассечения массива элементов из алгоритма сортировки QuickSort. Пусть нам надо найти
-ую порядковую статистику, а после рассечения опорный элемент встал на позицию . Возможно три случая:- k = m. Порядковая статистика найдена.
- k < m. Рекурсивно ищем -ую статистику в первой половине массива.
- k > m. Рекурсивно ищем -ую статистику во второй половине массива.
Код алгоритма
Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура partition принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля.
int findOrderStatistic(int[] array, int k) { int left = 0, right = array.length; while (true) { int mid = partition(array, left, right); if (mid == k) { return array[mid]; } else if (k < mid) { right = mid; } else { k -= mid + 1; left = mid + 1; } } }
Анализ времени работы
Аналогично QuickSort, может возникнуть такой же худщий случай (процедура partition возвращает каждый раз левую или правую границу рассматриваемой части), при котором время работы составит
. Однако, если считать, что partition возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как .