55
правок
Изменения
Нет описания правки
===Псевдокод===
select(A, l, r, k)
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;
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);