Изменения

Перейти к: навигация, поиск
Нет описания правки
#Если <tex>i</tex> <tex>=</tex> <tex>k</tex>, то возвращается значение <tex>x</tex>. Иначе вызывается рекурсивно шаг 1, и выполняется поиск <tex>k</tex>-го в порядке возрастания элемента в левой части массива,если <tex>i</tex> <tex><</tex> <tex>k</tex>, или в правой части, если <tex>i</tex> <tex>></tex> <tex>k</tex>.
===Псевдокод===
select(LA, l, r,k)
{
if (length(L) r - l + 1 <= 105) { sort L(A[l..r]); return the element in the kth position // вернем элемент, находящийся на A[k-ой позиции]; } partition L into subsets S for i = l:5:(r - 4) sort(A[i] of five elements each // разобьем L на подмножества S[..i+ 4] размером 5 по 5 элементов; (there will be n/5 subsets total).len = r - l + 1; for (i = Medians[1 to ..n/5) do x[i] = selectA[(l + 2):5:(S[i],3r - 2) //найдем медианы S[i]; M x = select({x[i]}Medians, 1, n/5, n/10) // M — рассекающий элемент; partition L into L1<M A = share(A, L2=Ml, L3>M // разобьем L на подмножества L1r, где все элементы меньше Mx); for i = l to r if (k <A[i] == length(L1x)) // L3, где все элементы больше M и L2 равное M m = i; return selectif (L1,m = k) else return A[m]; if (m > k > length(L1)+length(L2)) return select(L3A,k, r, m -length(L1)-length(L2)k + 1); else return M // элемент на select(A, l, k-ой позиции в исходном массиве, m);
}
 
===Пример===
На вход подается массив, разобьем элементы на группы по 5 элементов.
55
правок

Навигация