Сортування злиттям (англ. merge sort) — алгоритм сортування, в основі якого лежить принцип «Розділяй та володарюй».
В основі цього способу сортування лежить злиття двох упорядкованих ділянок масиву в одну впорядковану ділянку іншого масиву. Злиття двох упорядкованих послідовностей можна порівняти з перебудовою двох колон солдатів, вишикуваних за зростом, в одну, де вони також розташовуються за зростом. Якщо цим процесом керує офіцер, то він порівнює зріст солдатів, перших у своїх колонах і вказує, якому з них треба ставати останнім у нову колону, а кому залишатися першим у своїй. Так він вчиняє, поки одна з колон не вичерпається — тоді решта іншої колони додається до нової.
Під час сортування в дві допоміжні черги з основної поміщаються перші дві відсортовані підпослідовності, які потім зливаються в одну і результат записується в тимчасову чергу. Потім з основної черги беруться наступні дві відсортовані підпослідовності і так доти, доки основна черга не стане порожньою. Після цього послідовність з тимчасової черги переміщається в основну чергу. І знову продовжується сортування злиттям двох відсортованих підпослідовностей. Сортування триватиме доти, доки довжина відсортованої підпослідовності не стане рівною довжині самої послідовності.
Алгоритм сортування
Нехай у масиві Y з елемента Y[m] починається впорядкована ділянка довжиною s, а з елемента Y[m + s] – впорядкована ділянка довжини r. Наприклад,
Y | … | 1 | 3 | … | 13 | 2 | 4 | … | 88 |
… | m | m + 1 | m + s –1 | m + s | m + s + 1 | … | m + s + r |
Результатом злиття повинна бути ділянка довжини r + s у масиві X:
X | … | 1 | 2 | 3 | 4 | … | 13 | … | 88 |
… | m | m + 1 | m + 2 | m + 3 | … | m + s + r |
Тепер розглянемо сортування масиву A злиттям. На першому кроці елементи A[1], …, A[n] копіюються в допоміжний масив B[1], …, B[n]. Його елементи розглядаються парами B[1] і B[2], B[3] і B[4] тощо як упорядковані послідовності довжиною lp = 1 і зливаються за допомогою процедури mrg в масив A. Тепер там є впорядковані ділянки довжиною 2. За непарного n останній елемент A[n] залишається без змін як послідовність довжиною 1.
На наступному кроці після копіювання в масив B зливаються пари упорядкованих ділянок B[1]B[2] і B[3]B[4], B[5]B[6] і B[7]B[8] тощо. З'являються впорядковані ділянки довжиною 4. Нехай t = nmod4 — довжина залишку масиву після останньої повної четвірки елементів. При t = 1 або t = 2 останні t елементів утворюють упорядковану ділянку після попереднього кроку. При t = 3 зливаються упорядкована пара B[n – 1]B[n – 2] та ділянка B[n] у ділянку довжиною t.
Кроки повторюються з подвоєнням довжин упорядкованих ділянок lp, поки lp < n.
Розглянемо сортування злиттям масиву <11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1> довжини n = 11. Упорядковані послідовності в ньому вказуються в дужках <>, а пари таких, що зливаються, відокремлені ";": < <11><10>; <9><8>; <7><6>; <5><4>; <3><2>; <1> >, lp = 1 < <10, 11><8, 9>; <6, 7><4, 5>; <2, 3><1> >, lp = 2 < <8, 9, 10, 11><4, 5, 6, 7>;<1, 2, 3> >, lp=4 < <4, 5, 6, 7, 8, 9, 10, 11><1, 2, 3> >, lp = 8 <1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11>, lp = 16, lp³ n.
Як бачимо, нам знадобилося 4 кроки злиття для того, щоб одержати впорядкований масив. Очевидно, що після k-го кроку впорядковані ділянки мають довжину lp = 2k. Якщо 2k = n, то масив упорядковано. Якщо 2k > n, але 2k – 1 < n, то при виконанні останнього кроку мають місце співвідношення lp = 2k – 1 = 2k / 2 > n/2, npp = 0, tl = n > lp, і злиття ділянки довжиною lp та залишку довжиною n – lp дає впорядкований масив.
Оцінимо складність наведеного алгоритму. При кожному виконанні тіла циклу while значення всіх елементів масиву копіюються в допоміжний масив і назад по одному разу, тобто виконується O(n) елементарних дій. Після останнього k-го кроку 2k < 2n, тобто k < 1 + log n, і це означає, що тіло циклу while виконується 1 + log2n =O(log n) разів. Отже, складність алгоритму оцінюється як O(n log n).
Запишімо в таблицю значення виразів n, n(n – 1)/2, n(1+ë log2nû ) та округлене відношення r двох останніх:
n | n(n-1)/2 | n(1+ë log2nû ) | r |
10 | 45 | 40 | 1 |
100 | 4950 | 700 | 7 |
1000 | 499500 | 10000 | 50 |
10000 | 49995000 | 140000 | 350 |
Як бачимо, кожне зростання n у 10 разів веде до зростання n(n-1)/2 та n(1+ë log2nû ) приблизно в 100 й 14 разів відповідно, і за n=10000 сортування злиттям виконується в сотні разів скоріше, ніж бульбашкове! Зауважимо, що в наведеному алгоритмі сортування злиттям копіювання масиву в допоміжний указано лише для того, щоб ідею алгоритму було простіше сприйняти. Цей алгоритм нескладно переробити так, щоб замість копіювання в додатковий масив відбувалося злиття в нього упорядкованих ділянок. Отже, на кроках з номерами 1, 3, 5, … має відбуватися злиття в допоміжний масив, а на кроках 2, 4, 6, … – злиття в протилежному напрямку. Переробка алгоритму залишається вправою. Сортування злиттям можна задати рекурсивно: масив поділяється на дві приблизно рівні частини, які після сортування (тим самим способом – ось рекурсія!) зливаються. Коли ж довжина частини масиву зменшується до 1, відбувається просто повернення з рекурсії. Цей алгоритм уточнюється наступною процедурою Mrgrec. На відміну від процедури Merges, вона має два параметри-масиви (той, що сортується, та допоміжний), а також два числові параметри (початок і кінець частини масиву, яка сортується). Крім того, спочатку відбувається злиття ділянок основного масиву в допоміжний, а потім копіювання в основний: Ця функція набагато коротше нерекурсивної функції, але виконання її довше. Власне сортування починається лише після повернення з викликів, у яких l=r, а це практично "середина дистанції". Завершуючи описання сортування злиттям, скажемо, що цей алгоритм є першим із ефективних алгоритмів сортування. У 1945 році його винайшов Джон фон Нейман, один із піонерів програмування.
Псевдокод алгоритму
Процедура здійснює часткове впорядкування масиву , впорядковуючи його елементи з p-го по q-й здійснить впорядкування всього масиву).
1 if 2 then return 3 4 if 5 6 7
використовує допоміжну процедуру , що здійснює об'єднання частин масиву A з p-го по c-й елемент і з c+1-го по q-й елемент в один впорядкований підмасив. Для цього використовується один додатковий масив такої ж довжини як і (В деяких реалізаціях вдвічі коротший за — мінімально можлива його довжина).
1 2 3 for to 4 do if або ( і ) 5 then 6 7 else 8 9 for to 10 do
Аналіз алгоритму
Час роботи алгоритму по впорядкуванню елементів задовільняє рекурентному співвідношенню:
- , де — час на впорядкування половини масиву, — час на злиття цих половинок.
Враховуючи, що , розв'язком співвідношення є .
Крім того, алгоритм потребує для своєї роботи додаткової пам'яті.
Алгоритм не міняє порядок розташування однакових елементів, а отже він є стабільним.
Можливі оптимізації
Швидкість алгоритму є асимптотично оптимальною. Але її можна пришвидшити в константну кількість разів.
- Оптимізація впорядкування невеликих частин масиву — невеликі частини масиву (наприклад, при q-p<50) впорядковувати сортуванням вставкою.
- Оптимізація кількості копіювань елементів — при злитті двох впорядкованих масивів в один, кожен елемент копіюється двічі (спочатку у тимчасовий масив, а потім знову у початковий). Кількість копіювань можна зменшити удвічі, якщо по черзі використовувати для об'єднання початковий і тимчасовий масиви. Тоді можна не виконувати зайві операції копіювання (рядки 9-10 процедури Merge).
Робота алгоритму
Схема алгоритму для конкретного прикладу послідовності
Проілюструємо алгоритм сортування на такій послідовності: 42 5 30 36 25 10 37 49 0 0
На початку сортування відсортовані підпослідовності містять в собі по одному елементу.
Крок 1: 5 42 | 30 36 | 10 25 | 37 49 | 0 0
Крок 2: 5 30 36 42 | 10 25 37 49 | 0 0
Крок 3: 5 10 25 30 36 37 42 49 | 0 0
Крок 4: 0 0 5 10 25 30 36 37 42 49
Тестування алгоритму
Для перевірки правильності сортування звіримо сортування проведене програмою з сортуванням за даним алгоритмом вручну.
Проведемо сортування наступної послідовності: 56 19 3 95 23 17 38 44 69 73 84
На початку сортування послідовність є розбита на відсортовані підпослідовності по одному елементу в кожній.
56 | 19 | 3 | 95 | 23 | 17 | 38 | 44 | 69 | 73 | 84
далі кожні дві підпослідовності зливаються в одну відсортовану підпослідовність: 19 56 | 3 95 | 17 23 | 38 44 | 69 73 | 84
на наступному кроці отримаємо наступний результат злиття: 3 19 56 95 | 17 23 38 44 | 69 73 84 |
потім: 3 17 19 23 38 44 56 95 | 69 73 84 |
на останньому кроці отримаємо відсортовану послідовність: 3 17 19 23 38 44 56 69 73 84 | 95
Послідовність була відсортована за 4 кроки.
Приклад реалізації на С++
#include <algorithm> #include <vector> using namespace std; template <typename T> void merge_sort(T* elems, //original array T* tmp_elems, //temp array to hold intermediate results, should be same size as array "elems" size_t size) { if (size <= 1) {return;} //nothing to sort const size_t left_size = size / 2; const size_t right_size = size - left_size; merge_sort(elems, tmp_elems, left_size); merge_sort(elems + left_size, tmp_elems + left_size, right_size); T* leftIt = elems; // pointer to walk through left part T* const pivot = elems + left_size; //end of left part, start of right part T* rightIt = pivot; // pointer to walk through right part T*const end = elems + size; T* outputIt = tmp_elems; //pointer to where to write when merging left and right subparts while (true) { if (*leftIt < *rightIt) { *outputIt++ = *leftIt++; if (leftIt == pivot) { // copy the rest of right part that has not been copied yet copy(rightIt, end, outputIt); break; } } else { *outputIt++ = *rightIt++; if (rightIt == end) { // copy the rest of left part that has not been copied yet copy(leftIt, pivot, outputIt); break; } } } copy(tmp_elems, tmp_elems + size, elems); }
Алгоритм об'єднання без додаткової пам'яті
Цей алгоритм впорядкування масиву є модифікацією сортування злиттям. Він також є стабільним, але не потребує додаткової пам'яті.
Псевдокод алгоритму
Процедура працює аналогічно процедурі сортування злиттям:
1 if 2 then return 3 4 5 6
Відмінність алгоритмів полягає в процедурі , яка здійснює об'єднання двох впорядкованих масивів без додаткової пам'яті, але за час .
Існує декілька алгоритмів об'єднання двох впорядкованих масивів, що не потребують додаткової пам'яті. Розглянемо лише один з них.
Ідея алгоритму злиття
Нехай алгоритм має об'єднати дві частини масиву — з -го по -й і з -го по -й.
Виконаємо об'єднання в декілька етапів:
1. Знайдемо такі індекси , що 2. Змінимо порядок елементів масиву з на 3. Викличемо рекурсивне злиття для половин нового масиву.
Тобто, спочатку ми знаходимо елементи, що мають лежати в першій половині масиву (найменші), потім переміщаємо найменші елементи в цю половину. Тоді можна окремо впорядкувати першу і другу половини масиву (кожна з половин також буде складатися з двох впорядкованих частин, що треба об'єднати).
Пункт 1, можна виконати за один лінійний прохід. Другий крок — це по-суті циклічний зсув частини масиву на j елементів. Він може бути виконаний за лінійний час, наприклад, за допомогою трьох перегортань.
Псевдокод алгоритму злиття
1. if або 2. then return 3. 4. 5. 6. 7. While 8. do if 9. then 10. else 11. 12. 13. 14. 15. 16.
Функція перегортає або дзеркально відображає частину масиву A з a-го по b-й елементи включно.
Аналіз алгоритму
Спочатку проаналізуймо функцію ModifiedMerge. Вона виконує два кроки, що потребують O(n) часу, і двічі викликає себе від масиву, що у двічі менший за початковий.
Отже, час роботи функції на масиви довжиною n:
Тепер можемо визначити час роботи алгоритму впорядкування, він виражається рівнянням:
Застосування
Алгоритм використовується в деяких реалізаціях функції stable_sort() з стандартної бібліотеки шаблонів (STL) мови програмування C++.
Джерела
- Дональд Кнут. Sorting and Searching // The Art of Computer Programming. — 3rd. — Massachusetts : Addison–Wesley, 1998. — Т. 3. — 780 с. — .(англ.)
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. II. Сортування і порядкові статистики. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Посилання
- Алгоритм
- Наочна демонстрація сортування злиттям національним танцювальним ансамблем трансильванських німців на YouTube
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuvannya zlittyam angl merge sort algoritm sortuvannya v osnovi yakogo lezhit princip Rozdilyaj ta volodaryuj Priklad sortuvannya zlittyam V osnovi cogo sposobu sortuvannya lezhit zlittya dvoh uporyadkovanih dilyanok masivu v odnu vporyadkovanu dilyanku inshogo masivu Zlittya dvoh uporyadkovanih poslidovnostej mozhna porivnyati z perebudovoyu dvoh kolon soldativ vishikuvanih za zrostom v odnu de voni takozh roztashovuyutsya za zrostom Yaksho cim procesom keruye oficer to vin porivnyuye zrist soldativ pershih u svoyih kolonah i vkazuye yakomu z nih treba stavati ostannim u novu kolonu a komu zalishatisya pershim u svoyij Tak vin vchinyaye poki odna z kolon ne vicherpayetsya todi reshta inshoyi koloni dodayetsya do novoyi Pid chas sortuvannya v dvi dopomizhni chergi z osnovnoyi pomishayutsya pershi dvi vidsortovani pidposlidovnosti yaki potim zlivayutsya v odnu i rezultat zapisuyetsya v timchasovu chergu Potim z osnovnoyi chergi berutsya nastupni dvi vidsortovani pidposlidovnosti i tak doti doki osnovna cherga ne stane porozhnoyu Pislya cogo poslidovnist z timchasovoyi chergi peremishayetsya v osnovnu chergu I znovu prodovzhuyetsya sortuvannya zlittyam dvoh vidsortovanih pidposlidovnostej Sortuvannya trivatime doti doki dovzhina vidsortovanoyi pidposlidovnosti ne stane rivnoyu dovzhini samoyi poslidovnosti Algoritm sortuvannyaNehaj u masivi Y z elementa Y m pochinayetsya vporyadkovana dilyanka dovzhinoyu s a z elementa Y m s vporyadkovana dilyanka dovzhini r Napriklad Y 1 3 13 2 4 88 m m 1 m s 1 m s m s 1 m s r Rezultatom zlittya povinna buti dilyanka dovzhini r s u masivi X X 1 2 3 4 13 88 m m 1 m 2 m 3 m s r Teper rozglyanemo sortuvannya masivu A zlittyam Na pershomu kroci elementi A 1 A n kopiyuyutsya v dopomizhnij masiv B 1 B n Jogo elementi rozglyadayutsya parami B 1 i B 2 B 3 i B 4 tosho yak uporyadkovani poslidovnosti dovzhinoyu lp 1 i zlivayutsya za dopomogoyu proceduri mrg v masiv A Teper tam ye vporyadkovani dilyanki dovzhinoyu 2 Za neparnogo n ostannij element A n zalishayetsya bez zmin yak poslidovnist dovzhinoyu 1 Na nastupnomu kroci pislya kopiyuvannya v masiv B zlivayutsya pari uporyadkovanih dilyanok B 1 B 2 i B 3 B 4 B 5 B 6 i B 7 B 8 tosho Z yavlyayutsya vporyadkovani dilyanki dovzhinoyu 4 Nehaj t nmod4 dovzhina zalishku masivu pislya ostannoyi povnoyi chetvirki elementiv Pri t 1 abo t 2 ostanni t elementiv utvoryuyut uporyadkovanu dilyanku pislya poperednogo kroku Pri t 3 zlivayutsya uporyadkovana para B n 1 B n 2 ta dilyanka B n u dilyanku dovzhinoyu t Kroki povtoryuyutsya z podvoyennyam dovzhin uporyadkovanih dilyanok lp poki lp lt n Rozglyanemo sortuvannya zlittyam masivu lt 11 10 9 8 7 6 5 4 3 2 1 gt dovzhini n 11 Uporyadkovani poslidovnosti v nomu vkazuyutsya v duzhkah lt gt a pari takih sho zlivayutsya vidokremleni lt lt 11 gt lt 10 gt lt 9 gt lt 8 gt lt 7 gt lt 6 gt lt 5 gt lt 4 gt lt 3 gt lt 2 gt lt 1 gt gt lp 1 lt lt 10 11 gt lt 8 9 gt lt 6 7 gt lt 4 5 gt lt 2 3 gt lt 1 gt gt lp 2 lt lt 8 9 10 11 gt lt 4 5 6 7 gt lt 1 2 3 gt gt lp 4 lt lt 4 5 6 7 8 9 10 11 gt lt 1 2 3 gt gt lp 8 lt 1 2 3 4 5 6 7 8 9 10 11 gt lp 16 lp n Yak bachimo nam znadobilosya 4 kroki zlittya dlya togo shob oderzhati vporyadkovanij masiv Ochevidno sho pislya k go kroku vporyadkovani dilyanki mayut dovzhinu lp 2k Yaksho 2k n to masiv uporyadkovano Yaksho 2k gt n ale 2k 1 lt n to pri vikonanni ostannogo kroku mayut misce spivvidnoshennya lp 2k 1 2k 2 gt n 2 npp 0 tl n gt lp i zlittya dilyanki dovzhinoyu lp ta zalishku dovzhinoyu n lp daye vporyadkovanij masiv Ocinimo skladnist navedenogo algoritmu Pri kozhnomu vikonanni tila ciklu while znachennya vsih elementiv masivu kopiyuyutsya v dopomizhnij masiv i nazad po odnomu razu tobto vikonuyetsya O n elementarnih dij Pislya ostannogo k go kroku 2k lt 2n tobto k lt 1 log n i ce oznachaye sho tilo ciklu while vikonuyetsya 1 log2n O log n raziv Otzhe skladnist algoritmu ocinyuyetsya yak O n log n Zapishimo v tablicyu znachennya viraziv n n n 1 2 n 1 e log2nu ta okruglene vidnoshennya r dvoh ostannih n n n 1 2 n 1 e log2nu r 10 45 40 1 100 4950 700 7 1000 499500 10000 50 10000 49995000 140000 350 Yak bachimo kozhne zrostannya n u 10 raziv vede do zrostannya n n 1 2 ta n 1 e log2nu priblizno v 100 j 14 raziv vidpovidno i za n 10000 sortuvannya zlittyam vikonuyetsya v sotni raziv skorishe nizh bulbashkove Zauvazhimo sho v navedenomu algoritmi sortuvannya zlittyam kopiyuvannya masivu v dopomizhnij ukazano lishe dlya togo shob ideyu algoritmu bulo prostishe sprijnyati Cej algoritm neskladno pererobiti tak shob zamist kopiyuvannya v dodatkovij masiv vidbuvalosya zlittya v nogo uporyadkovanih dilyanok Otzhe na krokah z nomerami 1 3 5 maye vidbuvatisya zlittya v dopomizhnij masiv a na krokah 2 4 6 zlittya v protilezhnomu napryamku Pererobka algoritmu zalishayetsya vpravoyu Sortuvannya zlittyam mozhna zadati rekursivno masiv podilyayetsya na dvi priblizno rivni chastini yaki pislya sortuvannya tim samim sposobom os rekursiya zlivayutsya Koli zh dovzhina chastini masivu zmenshuyetsya do 1 vidbuvayetsya prosto povernennya z rekursiyi Cej algoritm utochnyuyetsya nastupnoyu proceduroyu Mrgrec Na vidminu vid proceduri Merges vona maye dva parametri masivi toj sho sortuyetsya ta dopomizhnij a takozh dva chislovi parametri pochatok i kinec chastini masivu yaka sortuyetsya Krim togo spochatku vidbuvayetsya zlittya dilyanok osnovnogo masivu v dopomizhnij a potim kopiyuvannya v osnovnij Cya funkciya nabagato korotshe nerekursivnoyi funkciyi ale vikonannya yiyi dovshe Vlasne sortuvannya pochinayetsya lishe pislya povernennya z viklikiv u yakih l r a ce praktichno seredina distanciyi Zavershuyuchi opisannya sortuvannya zlittyam skazhemo sho cej algoritm ye pershim iz efektivnih algoritmiv sortuvannya U 1945 roci jogo vinajshov Dzhon fon Nejman odin iz pioneriv programuvannya Psevdokod algoritmu Procedura M e r g e S o r t A p q displaystyle MergeSort A p q zdijsnyuye chastkove vporyadkuvannya masivu A displaystyle A vporyadkovuyuchi jogo elementi z p go po q j M e r g e S o r t A 1 l e n g t h A displaystyle MergeSort A 1 length A zdijsnit vporyadkuvannya vsogo masivu M e r g e S o r t A p q displaystyle MergeSort A p q 1 if q p lt 1 displaystyle q p lt 1 2 then return 3 c p q 2 displaystyle c gets lfloor p q 2 rfloor 4 if q p gt 1 displaystyle q p gt 1 5 M e r g e S o r t A p c displaystyle MergeSort A p c 6 M e r g e S o r t A c 1 q displaystyle MergeSort A c 1 q 7 M e r g e A p c q displaystyle Merge A p c q M e r g e S o r t displaystyle MergeSort vikoristovuye dopomizhnu proceduru M e r g e A p c q displaystyle Merge A p c q sho zdijsnyuye ob yednannya chastin masivu A z p go po c j element i z c 1 go po q j element v odin vporyadkovanij pidmasiv Dlya cogo vikoristovuyetsya odin dodatkovij masiv B displaystyle B takoyi zh dovzhini yak i A displaystyle A V deyakih realizaciyah B displaystyle B vdvichi korotshij za A displaystyle A minimalno mozhliva jogo dovzhina M e r g e A p c q displaystyle Merge A p c q 1 i p displaystyle i gets p 2 j c 1 displaystyle j gets c 1 3 for k p displaystyle k gets p to q displaystyle q 4 do if j gt q displaystyle j gt q abo i c displaystyle i leq c i A i A j displaystyle A i leq A j 5 then B k A i displaystyle B k gets A i 6 i i 1 displaystyle i gets i 1 7 else B k A j displaystyle B k gets A j 8 j j 1 displaystyle j gets j 1 9 for k p displaystyle k gets p to q displaystyle q 10 do A k B k displaystyle A k B k Analiz algoritmu Chas roboti algoritmu T n displaystyle T n po vporyadkuvannyu n displaystyle n elementiv zadovilnyaye rekurentnomu spivvidnoshennyu T n 2 T n 2 O n displaystyle T n 2T left frac n 2 right O n de T n 2 displaystyle T left frac n 2 right chas na vporyadkuvannya polovini masivu O n displaystyle O n chas na zlittya cih polovinok Vrahovuyuchi sho T 1 O 1 displaystyle T 1 O 1 rozv yazkom spivvidnoshennya ye T n O n log n displaystyle T n O n log n Krim togo algoritm potrebuye dlya svoyeyi roboti O n displaystyle O n dodatkovoyi pam yati Algoritm ne minyaye poryadok roztashuvannya odnakovih elementiv a otzhe vin ye stabilnim Mozhlivi optimizaciyi Shvidkist algoritmu ye asimptotichno optimalnoyu Ale yiyi mozhna prishvidshiti v konstantnu kilkist raziv Optimizaciya vporyadkuvannya nevelikih chastin masivu neveliki chastini masivu napriklad pri q p lt 50 vporyadkovuvati sortuvannyam vstavkoyu Optimizaciya kilkosti kopiyuvan elementiv pri zlitti dvoh vporyadkovanih masiviv v odin kozhen element kopiyuyetsya dvichi spochatku u timchasovij masiv a potim znovu u pochatkovij Kilkist kopiyuvan mozhna zmenshiti udvichi yaksho po cherzi vikoristovuvati dlya ob yednannya pochatkovij i timchasovij masivi Todi mozhna ne vikonuvati zajvi operaciyi kopiyuvannya ryadki 9 10 proceduri Merge Robota algoritmu Shema algoritmu dlya konkretnogo prikladu poslidovnosti Proilyustruyemo algoritm sortuvannya na takij poslidovnosti 42 5 30 36 25 10 37 49 0 0 Na pochatku sortuvannya vidsortovani pidposlidovnosti mistyat v sobi po odnomu elementu Krok 1 5 42 30 36 10 25 37 49 0 0 Krok 2 5 30 36 42 10 25 37 49 0 0 Krok 3 5 10 25 30 36 37 42 49 0 0 Krok 4 0 0 5 10 25 30 36 37 42 49 Testuvannya algoritmu Dlya perevirki pravilnosti sortuvannya zvirimo sortuvannya provedene programoyu z sortuvannyam za danim algoritmom vruchnu Provedemo sortuvannya nastupnoyi poslidovnosti 56 19 3 95 23 17 38 44 69 73 84 Na pochatku sortuvannya poslidovnist ye rozbita na vidsortovani pidposlidovnosti po odnomu elementu v kozhnij 56 19 3 95 23 17 38 44 69 73 84 dali kozhni dvi pidposlidovnosti zlivayutsya v odnu vidsortovanu pidposlidovnist 19 56 3 95 17 23 38 44 69 73 84 na nastupnomu kroci otrimayemo nastupnij rezultat zlittya 3 19 56 95 17 23 38 44 69 73 84 potim 3 17 19 23 38 44 56 95 69 73 84 na ostannomu kroci otrimayemo vidsortovanu poslidovnist 3 17 19 23 38 44 56 69 73 84 95 Poslidovnist bula vidsortovana za 4 kroki Priklad realizaciyi na S include lt algorithm gt include lt vector gt using namespace std template lt typename T gt void merge sort T elems original array T tmp elems temp array to hold intermediate results should be same size as array elems size t size if size lt 1 return nothing to sort const size t left size size 2 const size t right size size left size merge sort elems tmp elems left size merge sort elems left size tmp elems left size right size T leftIt elems pointer to walk through left part T const pivot elems left size end of left part start of right part T rightIt pivot pointer to walk through right part T const end elems size T outputIt tmp elems pointer to where to write when merging left and right subparts while true if leftIt lt rightIt outputIt leftIt if leftIt pivot copy the rest of right part that has not been copied yet copy rightIt end outputIt break else outputIt rightIt if rightIt end copy the rest of left part that has not been copied yet copy leftIt pivot outputIt break copy tmp elems tmp elems size elems Algoritm ob yednannya bez dodatkovoyi pam yatiCej algoritm vporyadkuvannya masivu ye modifikaciyeyu sortuvannya zlittyam Vin takozh ye stabilnim ale ne potrebuye dodatkovoyi pam yati Psevdokod algoritmu Procedura S t a b l e S o r t A p q displaystyle StableSort A p q pracyuye analogichno proceduri M e r g e S o r t A p q displaystyle MergeSort A p q sortuvannya zlittyam S t a b l e S o r t A p q displaystyle StableSort A p q 1 if q p 1 displaystyle q p leq 1 2 then return 3 c p q 2 displaystyle c gets lfloor p q 2 rfloor 4 S t a b l e S o r t A p c displaystyle StableSort A p c 5 S t a b l e S o r t A c 1 q displaystyle StableSort A c 1 q 6 M o d i f i e d M e r g e A p c q displaystyle ModifiedMerge A p c q Vidminnist algoritmiv polyagaye v proceduri M o d i f i e d M e r g e displaystyle ModifiedMerge yaka zdijsnyuye ob yednannya dvoh vporyadkovanih masiviv bez dodatkovoyi pam yati ale za chas O n log n displaystyle O n log n Isnuye dekilka algoritmiv ob yednannya dvoh vporyadkovanih masiviv sho ne potrebuyut dodatkovoyi pam yati Rozglyanemo lishe odin z nih Ideya algoritmu zlittya Nehaj algoritm maye ob yednati dvi chastini masivu A displaystyle A z p displaystyle p go po c displaystyle c j i z c 1 displaystyle c 1 go po q displaystyle q j Vikonayemo ob yednannya v dekilka etapiv 1 Znajdemo taki indeksi i j displaystyle i j sho p i c c 1 j q i p 1 j c q p 1 2 displaystyle p leq i leq c c 1 leq j leq q i p 1 j c left lfloor frac q p 1 2 right rfloor j q A i A j 1 i c A c 1 lt A i 1 displaystyle j q lor A i leq A j 1 i c lor A c 1 lt A i 1 2 Zminimo poryadok elementiv masivu z p p 1 c c 1 q displaystyle p p 1 cdots c c 1 cdots q na p p 1 i c 1 c 2 j j 1 q i 1 i 2 c displaystyle p p 1 cdots i c 1 c 2 cdots j j 1 cdots q i 1 i 2 cdots c 3 Viklichemo rekursivne zlittya dlya polovin novogo masivu Tobto spochatku mi znahodimo elementi sho mayut lezhati v pershij polovini masivu najmenshi potim peremishayemo najmenshi elementi v cyu polovinu Todi mozhna okremo vporyadkuvati pershu i drugu polovini masivu kozhna z polovin takozh bude skladatisya z dvoh vporyadkovanih chastin sho treba ob yednati Punkt 1 mozhna vikonati za odin linijnij prohid Drugij krok ce po suti ciklichnij zsuv chastini masivu na j elementiv Vin mozhe buti vikonanij za linijnij chas napriklad za dopomogoyu troh peregortan Psevdokod algoritmu zlittya M o d i f i e d M e r g e A p c q displaystyle ModifiedMerge A p c q 1 if p gt c displaystyle p gt c abo c 1 gt q displaystyle c 1 gt q 2 then return 3 N q p 1 displaystyle N leftarrow q p 1 4 m 0 displaystyle m leftarrow 0 5 i p 1 displaystyle i leftarrow p 1 6 j c displaystyle j leftarrow c 7 While m lt N 2 displaystyle m lt left lfloor frac N 2 right rfloor 8 do if j q i lt c A i 1 lt A j 1 displaystyle j q lor i lt c land A i 1 lt A j 1 9 then i i 1 displaystyle i leftarrow i 1 10 else j j 1 displaystyle j leftarrow j 1 11 m m 1 displaystyle m leftarrow m 1 12 R e v e r s e A i 1 c 1 displaystyle Reverse A i 1 c 1 13 R e v e r s e A c 1 q displaystyle Reverse A c 1 q 14 R e v e r s e A i 1 q displaystyle Reverse A i 1 q 15 M o d i f i e d M e r g e A p i j c i displaystyle ModifiedMerge A p i j c i 16 M o d i f i e d M e r g e A j c i 1 q c i 1 q displaystyle ModifiedMerge A j c i 1 q c i 1 q Funkciya R e v e r s e A a b displaystyle Reverse A a b peregortaye abo dzerkalno vidobrazhaye chastinu masivu A z a go po b j elementi vklyuchno Analiz algoritmu Spochatku proanalizujmo funkciyu ModifiedMerge Vona vikonuye dva kroki sho potrebuyut O n chasu i dvichi viklikaye sebe vid masivu sho u dvichi menshij za pochatkovij Otzhe chas roboti funkciyi na masivi dovzhinoyu n T n O n 2 T n 2 O n log n displaystyle T n O n 2T left frac n 2 right O n log n Teper mozhemo viznachiti chas roboti algoritmu vporyadkuvannya vin virazhayetsya rivnyannyam T n 2 T n 2 O n log n O n log 2 n displaystyle T n 2T left frac n 2 right O n log n O n log 2 n Zastosuvannya Algoritm vikoristovuyetsya v deyakih realizaciyah funkciyi stable sort z standartnoyi biblioteki shabloniv STL movi programuvannya C DzherelaDonald Knut Sorting and Searching The Art of Computer Programming 3rd Massachusetts Addison Wesley 1998 T 3 780 s ISBN 0 201 89685 0 angl T Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 II Sortuvannya i poryadkovi statistiki Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 PosilannyaAlgoritm Naochna demonstraciya sortuvannya zlittyam nacionalnim tancyuvalnim ansamblem transilvanskih nimciv na YouTube