Поиск k-ой порядковой статистики — различия между версиями
(Новая страница: «{{В разработке}} {{Определение |definition= '''<tex>k</tex>-ой порядковой статистикой''' набора элементо…») |
(→Код алгоритма) |
||
Строка 19: | Строка 19: | ||
Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля. | Ниже представлен код представленного алгоритма. При реализации, однако, вместо рекурсивных вызовов изменяются границы поиска статистики во внешнем цикле. В коде счититаем, что процедура '''partition''' принимает массив и границы отрезка, который будет рассечён (причём правая граница отрезка не включается) и возвращает индекс опорного элемента. Также, считается, что массив индексируется с нуля. | ||
− | int findOrderStatistic(int[] array, int k) { | + | '''int''' findOrderStatistic('''int[]''' array, '''int''' k) { |
− | int left = 0, right = array.length; | + | '''int''' left = 0, right = array.length; |
− | while (true) { | + | '''while''' ('''true''') { |
− | int mid = partition(array, left, right); | + | '''int''' mid = partition(array, left, right); |
− | if (mid == k) { | + | '''if''' (mid == k) { |
− | return array[mid]; | + | '''return''' array[mid]; |
} | } | ||
− | else if (k < mid) { | + | '''else if''' (k < mid) { |
right = mid; | right = mid; | ||
} | } | ||
− | else { | + | '''else''' { |
k -= mid + 1; | k -= mid + 1; | ||
left = mid + 1; | left = mid + 1; |
Версия 20:48, 14 мая 2011
Эта статья находится в разработке!
Определение: |
-ой порядковой статистикой набора элементов линейно упорядоченного множества называется такой его элемент, который является -ым элементом набора в порядке сортировки |
Содержание
Модификация 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 возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как .