Я читаю "Insertion Sort is O(nlogn) by Michael A. Bender , Martín Farach-Colton , Miguel Mosteiro", и я не совсем понимаю, как работает алгоритм и как его реализовать, даже с помощью Wikipedia. Ниже приведено описание алгоритма, извлеченного из оригинальной статьи.Попытка понять "LibrarySort"?
1) Пусть A является массивом n-элементов для сортировки. Эти элементы вставляются один в время в случайном порядке в сортировочный массив S размера (1 + ε) n.
Итак, первый шаг - создание массива размера (1 + ε) n. Пусть ε = 1, тогда мне нужно создать массив с удвоенным размером исходного массива.
2) Вставки выполняются в журнальных циклах (n) следующим образом. Каждый раунд удваивает количество элементов, вставленных в S, и удваивает префикс S, где находятся элементы.
Я понимаю, что будет внешний цикл, который будет циклически регистрировать время (n). В каждом раунде мне нужно удвоить количество элементов из A (исходный массив) до массива S. То, что я действительно не понимаю, это «двойной префикс S».
3) В частности, круглый я я заканчивается, когда элемент 2 я вставляется и элементы балансировки. Перед перебалансировкой элементы 2 i находятся в первых положениях (1 + ε) 2 i. Перебалансировка перемещает их в первую (2 + 2ε) 2 i позиции, распространяя элементы как можно более равномерно. Мы называем 2 + 2ε коэффициентом распространения.
От этого я понимаю, что за каждый раунд мы будем выполнять «перебалансировку». «rebalance» будет равномерно распространять исходный элемент в массиве S, чтобы он оставил некоторый промежуток между элементами. Формула для распространения элемента является: к = я * (1 + ε), где я старый индекс и к является новый индекс.
4) Вставка 2 I-1 вставочных элементов в раунде я я выполняется в переборе пути: поиск целевого положения элемента, чтобы быть вставленной двоичного поиска (среди 2 i-1 опорных позиций в S) и перемещать элементы высшего ранга, чтобы освободить место для нового элемента. Не все элементы более высокого ранга необходимо перенести, только те, что находятся в соседних позициях массива, до ближайшего разрыва.
В этой части показано, как вставить каждый элемент в массив S. Во-первых, используйте двоичный поиск для поиска, где должен принадлежать элемент. Затем сдвиньте более высокий ранг, пока он не достигнет пробела.
Это перевод алгоритма из того, что я понимаю (где А массив для сортировки и массива начинаются с индексом 1):
def LibrarySort(A) n ← length(A) S ← array of size (1 + ε) * n for i ← 1 to n S[i] = null for i ← 1 to floor(log(n) + 1) for j ← 2i - 1 to 2i index = binarysearch(S, A[j]) insert(S, A[j], index) rebalance()
Тогда для вставки() принимает 3 параметра: массив, элемент для вставки и местоположение.
def insert(S, item, index)
if S[index] != null
tmp ← S[index]
i ← index + 1
while i <= length(S) and S[i] != null
swap(tmp, S[i])
i++
S[index] ← item
Вопросы
- Это то, что я понимаю правильно?
- Что такое "double prefix of S"?