Сортування Шелла
![]() Демонстрація сортування Шелла з інтервалами 23, 10, 4, 1. |
|
| Клас | Алгоритм сортування |
|---|---|
| Структура даних | Масив |
| Найгірша швидкодія | ![]() |
| Оптимальний | Переважно ні |
Сортува́ння Ше́лла — це алгоритм сортування, що є узагальненням сортування включенням.
Алгоритм базується на двох тезах:
- Сортування включенням ефективне для майже впорядкованих масивів.
- Сортування включенням неефективне, тому що переміщує елемент тільки на одну позицію за раз.
Тому сортування Шелла виконує декілька впорядкувань включенням, кожен раз порівнюючи і переставляючи елементи, що розташовані на різній відстані один від одного.
Сортування Шелла не є стабільним.
Зміст |
Історія [ред.]
Сортування Шелла названо начесть автора — Дональда Шелла, який опублікував цей алгоритм у 1959[1] році. В деяких пізніших друкованих виданнях алгоритм називають сортуванням Шелла-Мацнера, за ім'ям Нортона Мацнера. Але сам Мацнер стверджував: «Мені не довелось нічого робити з цим алгоритмом, і моє ім'я не має пов'язуватись з ним».[2]
Ідея алгоритму [ред.]
На початку обираються m-елементів:
, причому,
.
Потім виконується m впорядкувань методом включення, спочатку для елементів, що стоять через
, потім для елементів через
і т. д. до
.
Ефективність досягається тим, що кожне наступне впорядкування вимагає меншої кількості перестановок, оскільки деякі елементи вже стали на свої місця.
Псевдокод [ред.]
Сам алгоритм не залежить від вибору m і d, тому будемо вважати, що вони задані.
1. for
to
2. do for
to
3. do
4.
5. while
і
6. do
7.
8.
![]()
Коректність алгоритма [ред.]
Оскільки
то на останньому кроці виконується звичайне впорядкування включенням всього масиву, а отже кінцевий масив буде впорядкованим.
Час роботи [ред.]
Час роботи залежить від вибору значень елементів масиву d. Існує декілька підходів вибору цих значень:
- При виборі
час роботи алгоритму, в найгіршому випадку, є
. - Якщо d — впорядкованний за спаданням набір чисел виду
, то час роботи є
. - Якщо d — впорядкованний за спаданням набір чисел виду
, то час роботи є
.
Приклад роботи [ред.]
Проілюструймо роботу алгоритму на вхідному масиві A = (5,16,1,32,44,3,16,7), d = (5,3,1).
- Масив після впорядкування з кроком в 5: (3,16,1,32,44,5,16,7) — зроблено 1 обмін.
- Масив після впорядкування з кроком 3: (3,7,1,16,16,5,32,44) — зроблено 3 обміна.
- Масив після впорядкування з кроком 1: (1,3,5,7,16,16,32,44) — зроблено 5 обмінів.
Отже, весь масив впорядковано за 8 операцій обміну.
Реалізація (Паскаль/DELPHI) [ред.]
program MyVerShellSort; {$APPTYPE CONSOLE} uses SysUtils; type massive=array[1..100] of integer; var A:massive; n:integer; procedure RndArrInput(var a1:massive; n1:integer); var i1:integer; begin randomize; for i1:=1 to n1 do a1[i1]:=10-random(20); end; procedure Arroutput(a2:massive; n2:integer); var i2:integer; begin for i2:=1 to n2 do write(a2[i2],' '); end; Procedure change (var k,l:integer); var tmp:integer; begin tmp:=k; k:=l; l:=tmp; end; procedure ShellSort(var A:massive; n:integer); Var i,j,h:integer; Begin h:=N div 2; While h>0 do Begin For i:=1 to N-h do Begin j:=i; While (j>=1)and(A[j]>A[j+h]) do Begin change(a[j],a[j+h]); dec(j); End; End; h:=h div 2; end; end; begin writeln('enter data:'); readln(n); RndArrInput(a,n); ArrOutPut(a,n); readln; ShellSort(a,n); ArrOutPut(a,n); readln; end.
Посилання [ред.]
- ↑ Shell D.L. A high-speed sorting procedure // Communications of the ACM. — Т. 2. — (1959) (7) С. 30–32. DOI:10.1145/368370.368387.
- ↑ «Shell sort». National Institute of Standards and Technology. Процитовано 2007-07-17.
|
||||||||||||||||||||||||||||



1. for
to
2. do for
to
3. do
4.
5. while
і
6. do
7.
8.
час роботи алгоритму, в найгіршому випадку, є
.
, то час роботи є
.
, то час роботи є
.