- •Метод Шелла
- •Алгоритм сортировки таблицы методом Шелла
- •Вспомогательные алгоритмы
- •2) Сортировка методом вставки группы записей, начиная с i-й, отстоящих на шаг h
- •Procedure sort_ins (T, n, i, h); Begin
- •Характеристики метода
- •Обменная сортировка с разделением ("быстрая" сортировка)
- •Используются два индекса для обращения к записям, ключи которых сравниваются с разделяющим элементом.
- •Параметры сортировки
- •Рекурсивная процедура "быстрой" сортировки
- •«Быстрая» сортировка с первым разделяющим элементом
- •Алгоритм разделения:
- •Пример выполнения
- •Сортировка со средним разделяющим элементом (алгоритм разделения):
- •Пример выполнения
Метод Шелла
Таблица разбивается на группы элементов (записей). В группу входят записи, отстоящие друг от друга на заданное расстояние h (шаг группы).
Каждая группа упорядочивается методом вставки.
Далее- шаг делится пополам и все
повторяется |
1 |
Первый шаг группы: Шелл - h1=[n/2],
Хиббард - h1=2k-1, где 2k < n <=2k+1,
где n – размер таблицы. Далее: hi = [hi-1/2].
2
|
Номера позиций упорядочиваемой таблицы |
|
Шаг |
||||||||||||
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
6 |
1 |
3 |
15 |
8 |
14 |
13 |
11 |
10 |
4 |
9 |
2 |
5 |
12 |
7 |
h=7 |
6 |
1 |
3 |
15 |
8 |
14 |
13 |
7 |
10 |
4 |
9 |
2 |
5 |
12 |
11 |
|
6 |
1 |
3 |
15 |
8 |
14 |
13 |
7 |
10 |
4 |
9 |
2 |
5 |
12 |
11 |
|
6 |
1 |
3 |
15 |
8 |
14 |
13 |
7 |
10 |
4 |
9 |
2 |
5 |
12 |
11 |
|
6 |
1 |
3 |
9 |
8 |
14 |
13 |
7 |
10 |
4 |
15 |
2 |
5 |
12 |
11 |
|
6 |
1 |
3 |
9 |
2 |
14 |
13 |
7 |
10 |
4 |
15 |
8 |
5 |
12 |
11 |
|
6 |
1 |
3 |
9 |
2 |
5 |
13 |
7 |
10 |
4 |
15 |
8 |
14 |
12 |
11 |
|
6 |
1 |
3 |
9 |
2 |
5 |
12 |
7 |
10 |
4 |
15 |
8 |
14 |
13 |
11 |
h=3 |
4 |
1 |
3 |
6 |
2 |
5 |
9 |
7 |
10 |
12 |
15 |
8 |
14 |
13 |
11 |
|
4 |
1 |
3 |
6 |
2 |
5 |
9 |
7 |
10 |
12 |
13 |
8 |
14 |
15 |
11 |
|
4 |
1 |
3 |
6 |
2 |
5 |
9 |
7 |
8 |
12 |
13 |
10 |
14 |
15 |
11 |
h=1 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
Алгоритм сортировки таблицы методом Шелла
Параметры:
T – сортируемая таблица;
n – число записей в таблице.
4
h:=нач_шаг(n); while h>=1 Begin
for i:=1 to h do sort_ins(T, n, i, h);
h:=h div 2;
End;
5
Вспомогательные алгоритмы
1)Определение начального шага группы (по рекомендации Хиббарда)
Function нач_шаг(n):integer; begin
h:=1;
while h*2<n do h:=h*2;
нач_шаг:=h-1;
End;
6
2) Сортировка методом вставки группы записей, начиная с i-й, отстоящих на шаг h
7
Procedure sort_ins (T, n, i, h); Begin
k:=i+h; while k<n begin
if (t[k].ключ>t[k-h].ключ) then begin
temp:=t[j]; |
j:=k-h; |
while (j>i) |
and (t[j].ключ>temp.ключ) do |
begin |
|
T[j+h]:=T[j]; j:=j-h; |
|
end; |
|
T[k]:=temp; |
|
end; |
|
k:=k+h; |
|
end; |
8 |
End; |
Характеристики метода
. Число операций сравнения пропорционально n (log2n)2 .
9
Обменная сортировка с разделением ("быстрая" сортировка)
Предложена Ч. Хоаром.
Цель каждого шага - помещение разделяющего элемента (записи) на конечную позицию внутри таблицы:
Разделяющий |
|
элемент |
|
. . . |
. . . |
Меньшие |
Большие |
10 |
ключи |
ключи |
|