Изменения

Перейти к: навигация, поиск
Нет описания правки
===Псевдокод===
select(A, l, r, k)
{ //если элементов не больше 5, сортируем их и возвращаем к-ый элемент
if (r - l + 1 <= 5) {
sort(A[l..r]); //если элементов не больше 5, сортируем их и возвращаем к-ый элемент
return A[k];
}
//сортируем каждую группу
for i = l..(r - 4)
sort(A[i..i + 4]; //сортируем каждую группу
i += 5;
//создаем массив медиан
n = r - l + 1;
j = l + 2;
Medians[1..n / 5]; //создаем массив медиан
for i = 1..n / 5
Medians[i] = A[j];
j += 5;
//x - рассекающий элемент x = select(Medians, 1, n/5, n/10); //делим массив относительно элемента x- рассекающий элемент A = share(A, l, r, x); //находим индекс делим массив относительно элемента x в исходном массиве
for i = l to r
if (A[i] == x) //находим индекс элемента x в исходном массиве
m = i;
if (m = k)
return A[m];
//делаем рекурсивный вызов от той части массива, где находится к-ый элемент
if (m > k)
select(A, k, r, m - k + 1); //делаем рекурсивный вызов от той части массива, где находится к-ый элемент
else
select(A, l, k, m);
55
правок

Навигация