Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
сиаод_ответы_16_79.doc
Скачиваний:
209
Добавлен:
11.05.2015
Размер:
7.84 Mб
Скачать

42. Вставка с убывающим шагом.

Рассматриваются пары с шагом h/2, если элем не упорядочены, то меняем их местами.

Рассматриваются группы с шагом h/4, выполняем сортировку в группах,

уменьшаем шаг и т.д. Проходим по всему массиву.

Простая вставка n2/4 – вычислительная сложность.

Вычислительная сложность O(n(logn)2)

Пример: Для примера возьмем 16 элементов [1..16]. Сначала просматриваются пары с шагом 8. Это пары элементов 1-9, 2-10, 3-11, 4-12, 5-13, 6-14, 7-15, 8-16. Если значения элементов в паре не упорядочены по возрастанию, то элементы меняются местами. Назовем этот этап 8-сортировкой. Следующий этап - 4-сортировка, на котором элементы в файле делятся на четверки: 1-5-9-13, 2-6-10-14, 3-7-11-15,4-8-12-16. Выполняется сортировка в каждой четверке. Сортировка может выполняться методом простых вставок (п.1). Следующий этап - 2-сортировка, когда элементы в файле делятся на 2 группы по 8:

1-3-5-7-9-11-13-15 и 2-4-6-8-10-12-14-16. Выполняется сортировка в каждой восьмерке. Наконец весь файл упорядочивается методом простых вставок.

ShellSort(x, n, hs, s)

For i: = s downto 1 do

H:=hs

For j:=h+1 to n do begin

Y:=x[j]

k:=j-h

while (k>=1) and (y<x[k]) do begin

x[k+h]:=x[k]

k:=k-h

end

x[k+h]:=y

end;

end;

43. Быстрая сортировка.

Среднее время работы . Время работы алгоритма для массива из  элементов в худшем случае может составить , на практике этот алгоритм является одним из самых быстрых.

Алгоритм:

  • из массива выбирается некоторый опорный элемент .

  • запускается процедура разделения массива, которая перемещает все ключи, меньшие, либо равные , влево от него, а все ключи, большие, либо равные  — вправо.

  • для обоих подмассивов: если в подмассиве более двух элементов, рекурсивно запускаем для него ту же процедуру.

QuickSort(A,first, last)

If first<last then

Q<–Partition(A,first,last)

QuickSort(A,first, q)

QuickSort(A,q+1, last)

Partition

X<-A[first]

I<-first-1;

J<-last+1

While true do

Repeat j<-j-1

untilA[j]=<x

Repeat i<-i+1

untilA[j]>=x

if i<j then A[i}<–>A[j]

else rerurn j;

44. Быстрая двоичная сортировка.

Бинарная быстрая сортировка по старшему разряду. На каждом уровне рекурсии рассматриваем старший бит из еще нерассмотренных. Числа с нулевым битом - в левую часть подмассива, с единичным - в правую. Закончили - делаем то же самое со след. битом в каждом из подмассивов.

Алгоритм:

1.последовательно вставляем элементы исходно массива в БДП

2.выполняем симметричный обход сформированного дерева

3. при посещении узлов – копируем содержимое в выходной массив

Время работы алгоритма:

O(log2n) – лучший; O(n) – худший; O(nlog2n) – вставок элементов.

Минус – повышенные требования к объему памяти.

Алгоритм Sort(A[1..n, first, last,d)

  1. if (first<last) and (d>0) then

  2. I <- first-1

  3. J<-last+1

  4. While i<j do

  5. Repeat j<-j-1

  6. Until ((digit(A[i],d)=0) or (j<=i)

  7. Repeat i<-i+1

  8. Until ((digit(A[i],d)=1) or (i>=j)

  9. If i<j then A[i]<->A[j]

  10. End while

  11. SortB(A[1..n], first,j,d-1)

  12. SortB(a[1..n],j+1,last,d+1)

  13. End if