Сортува́ння Ше́лла — це алгоритм сортування, що є узагальненням сортування включенням.
Демонстрація сортування Шелла з інтервалами 23, 10, 4, 1. | |
Клас | Алгоритм сортування |
---|---|
Структура даних | масив |
Найгірша швидкодія | |
Оптимальний | Переважно ні |
Алгоритм базується на двох тезах:
- Сортування включенням ефективне для майже впорядкованих масивів.
- Сортування включенням неефективне, тому що переміщує елемент тільки на одну позицію за раз.
Тому сортування Шелла виконує декілька впорядкувань включенням, кожен раз порівнюючи і переставляючи елементи, що розташовані на різній відстані один від одного.
Сортування Шелла не є стабільним.
Історія
Сортування Шелла названо на честь автора — , який опублікував цей алгоритм у 1959 році. В деяких пізніших друкованих виданнях алгоритм називають сортуванням Шелла-Мацнера, за ім'ям Нортона Мацнера. Але сам Мацнер стверджував: «Мені не довелось нічого робити з цим алгоритмом, і моє ім'я не має пов'язуватись з ним».
Ідея алгоритму
На початку обираються m-елементів: , причому, .
Потім виконується m впорядкувань методом включення, спочатку для елементів, що стоять через , потім для елементів через і т. д. до .
Ефективність досягається тим, що кожне наступне впорядкування вимагає меншої кількості перестановок, оскільки деякі елементи вже стали на свої місця.
Псевдокод
Сам алгоритм не залежить від вибору m і d, тому будемо вважати, що вони задані.
1. for to 2. do for to 3. do 4. 5. while and 6. do 7. 8.
Коректність алгоритму
Оскільки то на останньому кроці виконується звичайне впорядкування включенням всього масиву, а отже кінцевий масив буде впорядкованим.
Час роботи
Час роботи залежить від вибору значень елементів масиву d. Існує декілька підходів вибору цих значень:
- При виборі час роботи алгоритму, в найгіршому випадку, є .
- Якщо d — впорядкований за спаданням набір чисел виду , то час роботи є .
- Якщо d — впорядкований за спаданням набір чисел виду , то час роботи є .
- Якщо d — впорядкований за спаданням набір чисел одного з видів:
- (з додатковим членом 1 на початку)
- або ,
то час роботи алгоритму становить (Sedgewick, 1986).
- Існують інші, оптимальніші послідовності, для яких не визначена верхня асимптотична оцінка, наприклад:
- послідовність A102549 є найефективнішою з відомих, хоча формула для її визначення невідома (Ciura, 2001);
- послідовність A108870 є найшвидшою з тих, що мають відому формулу: (Tokuda, 1992).
Приклад роботи
Проілюструймо роботу алгоритму на вхідному масиві 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 обмінів.
Отже, весь масив впорядковано за 9 операцій обміну.
Реалізація (Паскаль/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.
Реалізація на C++
void sort_shell(int *a, int N) { for (int d = N/2; d >= 1; d /= 2) for (int i = d; i < N; i++) for (int j = i; j >= d && a[j-d] > a[j]; j -= d) swap(a[j], a[j-d]); }
Примітки
- Shell, D.L. (1959). A high-speed sorting procedure. Communications of the ACM. 2 (7): 30—32. doi:10.1145/368370.368387.
- Shell sort. National Institute of Standards and Technology. Архів оригіналу за 26 червня 2013. Процитовано 17 липня 2007.
- (1986). A New Upper Bound for Shellsort. Journal of Algorithms. 7 (2): 159—173. doi:10.1016/0196-6774(86)90001-5.
- Ciura, Marcin (2001). (PDF). У Freiwalds, Rusins (ред.). Proceedings of the 13th International Symposium on Fundamentals of Computation Theory. London: Springer-Verlag. с. 106—117. ISBN . Архів оригіналу (PDF) за 30 серпня 2011. Процитовано 23 вересня 2018.
- Tokuda, Naoyuki (1992). An Improved Shellsort. У van Leeuven, Jan (ред.). Proceedings of the IFIP 12th World Computer Congress on Algorithms, Software, Architecture. Amsterdam: North-Holland Publishing Co. с. 449—457. ISBN .
Посилання
- Наочна демонстрація сортування Шелла угорськими танцюристами.
Це незавершена стаття про алгоритми. Ви можете проєкту, виправивши або дописавши її. |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuva nnya She lla ce algoritm sortuvannya sho ye uzagalnennyam sortuvannya vklyuchennyam Sortuvannya ShellaDemonstraciya sortuvannya Shella z intervalami 23 10 4 1 KlasAlgoritm sortuvannyaStruktura danihmasivNajgirsha shvidkodiyaW n l o g 2 n displaystyle Omega nlog 2 n OptimalnijPerevazhno ni Sortuvannya Shella kolir algoritm bari Algoritm bazuyetsya na dvoh tezah Sortuvannya vklyuchennyam efektivne dlya majzhe vporyadkovanih masiviv Sortuvannya vklyuchennyam neefektivne tomu sho peremishuye element tilki na odnu poziciyu za raz Tomu sortuvannya Shella vikonuye dekilka vporyadkuvan vklyuchennyam kozhen raz porivnyuyuchi i perestavlyayuchi elementi sho roztashovani na riznij vidstani odin vid odnogo Sortuvannya Shella ne ye stabilnim IstoriyaSortuvannya Shella nazvano na chest avtora yakij opublikuvav cej algoritm u 1959 roci V deyakih piznishih drukovanih vidannyah algoritm nazivayut sortuvannyam Shella Macnera za im yam Nortona Macnera Ale sam Macner stverdzhuvav Meni ne dovelos nichogo robiti z cim algoritmom i moye im ya ne maye pov yazuvatis z nim Ideya algoritmuNa pochatku obirayutsya m elementiv d 1 d 2 d m displaystyle d 1 d 2 dots d m prichomu d 1 gt d 2 gt gt d m 1 displaystyle d 1 gt d 2 gt dots gt d m 1 Potim vikonuyetsya m vporyadkuvan metodom vklyuchennya spochatku dlya elementiv sho stoyat cherez d 1 displaystyle d 1 potim dlya elementiv cherez d 2 displaystyle d 2 i t d do d m 1 displaystyle d m 1 Efektivnist dosyagayetsya tim sho kozhne nastupne vporyadkuvannya vimagaye menshoyi kilkosti perestanovok oskilki deyaki elementi vzhe stali na svoyi miscya PsevdokodSam algoritm ne zalezhit vid viboru m i d tomu budemo vvazhati sho voni zadani S h e l l S o r t A N displaystyle Shell Sort A N 1 for k 1 displaystyle k leftarrow 1 to m displaystyle m 2 do for i d k 1 displaystyle i leftarrow d k 1 to N displaystyle N 3 do a A i displaystyle a leftarrow A i 4 j i displaystyle j leftarrow i 5 while j d k 1 displaystyle j d k geq 1 and A j d k gt a displaystyle A j d k gt a 6 do A j A j d k displaystyle A j leftarrow A j d k 7 j j d k displaystyle j leftarrow j d k 8 A j a displaystyle A j leftarrow a Korektnist algoritmuOskilki d m 1 displaystyle d m 1 to na ostannomu kroci vikonuyetsya zvichajne vporyadkuvannya vklyuchennyam vsogo masivu a otzhe kincevij masiv bude vporyadkovanim Chas robotiChas roboti zalezhit vid viboru znachen elementiv masivu d Isnuye dekilka pidhodiv viboru cih znachen Pri vibori d 1 N 2 d 2 d 1 2 d 3 d 2 2 d m 1 displaystyle d 1 left lfloor frac N 2 right rfloor d 2 left lfloor frac d 1 2 right rfloor d 3 left lfloor frac d 2 2 right rfloor dots d m 1 chas roboti algoritmu v najgirshomu vipadku ye O N 2 displaystyle O N 2 Yaksho d vporyadkovanij za spadannyam nabir chisel vidu 3 j 1 2 j N d i lt N displaystyle frac 3 j 1 2 j in mathbb N d i lt N to chas roboti ye O N 3 2 displaystyle O left N frac 3 2 right Yaksho d vporyadkovanij za spadannyam nabir chisel vidu 2 i 3 j i j N d k lt N displaystyle 2 i 3 j i j in mathbb N d k lt N to chas roboti ye O N log 2 N displaystyle O N log 2 N Yaksho d vporyadkovanij za spadannyam nabir chisel odnogo z vidiv 4 k 3 2 k 1 1 k N displaystyle 4 k 3 cdot 2 k 1 1 k in mathbb N z dodatkovim chlenom 1 na pochatku abo 9 2 k 2 k 2 1 k even 8 2 k 6 2 k 1 2 1 k odd displaystyle begin cases 9 left 2 k 2 frac k 2 right 1 amp k text even 8 cdot 2 k 6 cdot 2 k 1 2 1 amp k text odd end cases to chas roboti algoritmu stanovit O N 4 3 displaystyle O left N frac 4 3 right Sedgewick 1986 Isnuyut inshi optimalnishi poslidovnosti dlya yakih ne viznachena verhnya asimptotichna ocinka napriklad poslidovnist A102549 ye najefektivnishoyu z vidomih hocha formula dlya yiyi viznachennya nevidoma Ciura 2001 poslidovnist A108870 ye najshvidshoyu z tih sho mayut vidomu formulu 1 5 9 9 4 k 1 4 displaystyle left lceil frac 1 5 left 9 cdot left frac 9 4 right k 1 4 right right rceil Tokuda 1992 Priklad robotiProilyustrujmo robotu algoritmu na vhidnomu masivi A 5 16 1 32 44 3 16 7 d 5 3 1 Masiv pislya vporyadkuvannya z krokom v 5 3 16 1 32 44 5 16 7 zrobleno 1 obmin Masiv pislya vporyadkuvannya z krokom 3 3 7 1 16 16 5 32 44 zrobleno 3 obmini Masiv pislya vporyadkuvannya z krokom 1 1 3 5 7 16 16 32 44 zrobleno 5 obminiv Otzhe ves masiv vporyadkovano za 9 operacij obminu Realizaciya Paskal 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 gt 0 do begin for i 1 to N h do begin j i while j gt 1 and A j gt 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 Realizaciya na C void sort shell int a int N for int d N 2 d gt 1 d 2 for int i d i lt N i for int j i j gt d amp amp a j d gt a j j d swap a j a j d PrimitkiShell D L 1959 A high speed sorting procedure Communications of the ACM 2 7 30 32 doi 10 1145 368370 368387 Shell sort National Institute of Standards and Technology Arhiv originalu za 26 chervnya 2013 Procitovano 17 lipnya 2007 1986 A New Upper Bound for Shellsort Journal of Algorithms 7 2 159 173 doi 10 1016 0196 6774 86 90001 5 Ciura Marcin 2001 PDF U Freiwalds Rusins red Proceedings of the 13th International Symposium on Fundamentals of Computation Theory London Springer Verlag s 106 117 ISBN 3 540 42487 3 Arhiv originalu PDF za 30 serpnya 2011 Procitovano 23 veresnya 2018 Tokuda Naoyuki 1992 An Improved Shellsort U van Leeuven Jan red Proceedings of the IFIP 12th World Computer Congress on Algorithms Software Architecture Amsterdam North Holland Publishing Co s 449 457 ISBN 0 444 89747 X PosilannyaNaochna demonstraciya sortuvannya Shella ugorskimi tancyuristami Ce nezavershena stattya pro algoritmi Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi