Я знаю один алгоритм рандомизации с временной сложностью O (n) в ожидании.
Вот алгоритм:
Ввод: массив из n чисел A [1 ... n] [без ограничения общности мы можем предположить, что n четно]
Вывод: n / 2-й элемент в отсортированном массиве.
Алгоритм (A [1..n], k = n / 2):
Выберите точку поворота - p универсально случайным образом от 1 ... n
Разделенный массив на 2 части:
L - имеющий элемент <= A [p] </p>
R - имеющий элемент> A [p]
если (n / 2 == | L |) A [| L | + 1] - медианная остановка
если (n / 2 <| L |) повторно проклясть (L, k) </p>
еще раз прокляните на (R, k - (| L | + 1)
Сложность:
O (n)
доказательство все математическое. Одна страница длиной. Если тебе интересно пингуй меня.