Поиск 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 возвращает все элементы рассматриваемого отрезка с равной вероятностью, то можно оценить матожидание времени работы как .