Швидке сортування (англ. Quick Sort) — алгоритм сортування, розроблений Тоні Гоаром, який не потребує додаткової пам'яті і виконує у середньому операцій. Однак, у найгіршому випадку робить порівнянь. Позаяк алгоритм використовує дуже прості цикли і операції, він працює швидше за інші алгоритми, що мають таку ж асимптотичну оцінку складності. Наприклад, зазвичай більш ніж удвічі швидший порівняно з сортуванням злиттям.
алгоритм у дії під час сортування списку чисел | |
Клас | Алгоритм сортування |
---|---|
Структура даних | Різні |
Найгірша швидкодія | |
Найкраща швидкодія | |
Середня швидкодія | |
Просторова складність у найгіршому випадку | Залежить від реалізації |
Оптимальний | Інколи |
Стабільний | Ні |
Ідея алгоритму полягає в переставлянні елементів масиву таким чином, щоб його можна було розділити на дві частини і кожний елемент з першої частини був не більший за будь-який елемент з другої. Впорядкування кожної з частин відбувається рекурсивно. Алгоритм швидкого сортування може бути реалізований як у масиві, так і в двозв'язному списку.
Швидке сортування є алгоритмом на основі порівнянь і не є стабільним.
Історія
Алгоритм швидкого сортування було розроблено Тоні Гоаром у 1962 під час роботи у маленькій британській компанії [en].
Псевдокод алгоритму
Ця стаття потребує для відповідності Вікіпедії. |
Класичний алгоритм
У класичному варіанті, запропонованому Гоаром, з масиву обирали один елемент, а весь масив розбивали на дві частини за принципом: у першій частині — не більші за даний елемент, в другій — не менші за даний елемент. Процедура здійснює часткове впорядкування масиву з p-го по q-й індекс:
1 if return; 2 3 4 5 while do 6 repeat 7 8 until 9 repeat 10 11 until 12 if 13 then Swap 14 15
Сучасний алгоритм
Нині в стандартних бібліотеках використовують таку реалізацію алгоритму:
1 2 3 for to 4 do if 5 then 6 7 Swap 8 Swap 8 return
Функція Partition повертає індекс з опорним елементом, що розділяє масив на дві частини; ліву — елементи якої менше опорного елементу, і праву — елементи якої більше опорного елементу. Всередині функції опорним елементом вибирається останній елемент масиву і обхід здійснюється починаючи з першого елементу, прирівнюючи його до опорного.
1 if return; 2 3 4
Аналіз
Час роботи алгоритму сортування залежить від збалансованості, що характеризує розбиття. Збалансованість у свою чергу залежить від того, який елемент обрано як опорний (відносно якого елемента виконується розбиття). Якщо розбиття збалансоване, то асимптотично алгоритм працює так само швидко як і алгоритм сортування злиттям. У найгіршому випадку асимптотична поведінка алгоритму настільки ж погана, як і в алгоритму сортування включенням.
Найгірше розбиття
Найгірша поведінка має місце у тому випадку, коли процедура, що виконує розбиття, породжує одну підзадачу з n-1 елементом, а другу — з 0 елементами. Нехай таке незбалансоване розбиття виникає при кожному рекурсивному виклику. Для самого розбиття потрібен час . Тоді рекурентне співвідношення для часу роботи можна записати так:
Розв'язком такого співвідношення є .
Найкраще розбиття
В найкращому випадку процедура Partition ділить задачу на дві підзадачі, розмір кожної не перевищує n/2. Час роботи описується нерівністю:
Тоді:
— асимптотично найкращий час.
Середній випадок
Математичне очікування часу роботи алгоритму на всіх можливих вхідних масивах є , тобто середній випадок ближчий до найкращого.
Модифікації
В середньому алгоритм працює дуже швидко, але на практиці не всі можливі вхідні масиви мають однакову імовірність. Тоді шляхом додання рандомізації вдається отримати середній час роботи в будь-якому випадку.
Рандомізованний алгоритм
В рандомізованному алгоритмі, при кожному розбитті випадковий елемент обирається як опорний:
1 2 Поміняти 9 return
1 if return; 2 3 4
Реалізація мовою Pascal
Цей розділ не містить . (жовтень 2016) |
Ця процедура, після її оголошення, сортує масив mas, який складається з елементів типу integer.
Procedure QuickSort(first, last :integer); Var v, x, left, right :integer; begin left := first; right := last; v := mas[(left + right) div 2]; while left <= right do begin while mas[left] < v do left := left + 1; while mas[right] > v do right := right - 1; if left <= right then begin x := mas[left]; mas[left] := mas[right]; mas[right] := x; left := left + 1; right := right - 1; end; end; if first < right then QuickSort(first, right); if left < last then QuickSort(left, last); end;
Реалізація мовою C++
Цей розділ не містить . (травень 2021) |
Ця функція сортує масив array, що містить n елементів, де right = n-1.
right-left+1: +1 для того, аби у виклику QuickSort (array, 0, 1) опорним елементом вибирався правий елемент, що не допустить спробу декрементувати j, коли ця змінна вже рівна 0.
template <typename T> void QuickSort (T array[], size_t const left, size_t const right) { static T temp; size_t i=left, j=right; T pivot = array[left + ((right-left+1) >> 1)]; while (i <= j) { while (array[i] < pivot) ++i; while (array[j] > pivot) --j; if (i <= j) { temp = array[i]; array[i] = array[j]; array[j] = temp; ++i; --j; } } if (j > left) QuickSort (array, left, j); if (i < right) QuickSort (array, i, right); }
Реалізація мовою JavaScript
Функція quickSort приймає масив arr як вхідний параметр і повертає відсортований масив.
function quickSort(arr) { if (arr.length <= 1) { return arr; } const pivot = arr[Math.floor(arr.length / 2)]; const less = []; const greater = []; for (let i = 0; i < arr.length; i++) { if (arr[i] < pivot) { less.push(arr[i]); } else if (arr[i] > pivot) { greater.push(arr[i]); } } return [...quickSort(less), pivot, ...quickSort(greater)]; } // Приклад використання: const array = [5, 3, 1, 6, 2, 4]; const sortedArray = quickSort(array); console.log(sortedArray); // Результат // [1, 2, 3, 4, 5, 6]
Реалізація мовою Ruby
Метод quick_sort приймає масив arr як вхідний параметр і повертає відсортований масив.
def quick_sort(arr) return arr if arr.length <= 1 pivot = arr[arr.length / 2] less = [] greater = [] arr.each do |element| if element < pivot less << element elsif element > pivot greater << element end end return [*quick_sort(less), pivot, *quick_sort(greater)] end # Приклад використання: array = [5, 3, 1, 6, 2, 4] sorted_array = quick_sort(array) puts sorted_array # Результат # [1, 2, 3, 4, 5, 6]
Примітки
- Timeline of Computer History: 1960. Computer History Museum. Архів оригіналу за 25 червня 2013. Процитовано 5 січня 2009.
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Розділ 7. Швидке сортування. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. Розділ 7: Швидке сортування. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
- Приклад QuickSort алгоритму (JavaScript). tseivo.com. Процитовано 5 липня 2023.
- Приклад QuickSort алгоритму (Ruby). tseivo.com. Процитовано 5 липня 2023.
Література
- Т. Кормен; Ч. Лейзерсон; Р. Рівест; К. Стайн (2009) [1990]. 7 Швидке сортування. Вступ до алгоритмів (вид. 3rd). MIT Press і McGraw-Hill. ISBN .
Посилання
- Реалізація алгоритму швидкого сортування різними мовами програмування [ 7 лютого 2015 у Wayback Machine.]
- Реалізації алгоритму швидкого сортування різними мовами програмування в стилі грамотного програмування [ 9 травня 2008 у Wayback Machine.]
- Animated Sorting Algorithms: Quick Sort — графічна демонстрація роботи алгоритму
- Animated Sorting Algorithms: 3-Way Partition Quick Sort — графічна демонстрація алгоритму швидкого сортування з розбиттям масиву на три частини.
- Наочна демонстрація швидкого сортування угорськими танцюристами. [ 7 червня 2014 у Wayback Machine.]
- Interactive Tutorial for Quicksort [ 3 лютого 2009 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Shvidke sortuvannya angl Quick Sort algoritm sortuvannya rozroblenij Toni Goarom yakij ne potrebuye dodatkovoyi pam yati i vikonuye u serednomu O n log n displaystyle O n log n operacij Odnak u najgirshomu vipadku robit O n 2 displaystyle O n 2 porivnyan Pozayak algoritm vikoristovuye duzhe prosti cikli i operaciyi vin pracyuye shvidshe za inshi algoritmi sho mayut taku zh asimptotichnu ocinku skladnosti Napriklad zazvichaj bilsh nizh udvichi shvidshij porivnyano z sortuvannyam zlittyam Shvidke sortuvannyaalgoritm u diyi pid chas sortuvannya spisku chiselKlasAlgoritm sortuvannyaStruktura danihRizniNajgirsha shvidkodiyaO n 2 displaystyle O n 2 Najkrasha shvidkodiyaO n log n displaystyle O n log n Serednya shvidkodiyaO n log n displaystyle O n log n Prostorova skladnist u najgirshomu vipadkuZalezhit vid realizaciyiOptimalnijInkoliStabilnijNi Ideya algoritmu polyagaye v perestavlyanni elementiv masivu takim chinom shob jogo mozhna bulo rozdiliti na dvi chastini i kozhnij element z pershoyi chastini buv ne bilshij za bud yakij element z drugoyi Vporyadkuvannya kozhnoyi z chastin vidbuvayetsya rekursivno Algoritm shvidkogo sortuvannya mozhe buti realizovanij yak u masivi tak i v dvozv yaznomu spisku Shvidke sortuvannya ye algoritmom na osnovi porivnyan i ne ye stabilnim IstoriyaAlgoritm shvidkogo sortuvannya bulo rozrobleno Toni Goarom u 1962 pid chas roboti u malenkij britanskij kompaniyi en Psevdokod algoritmuCya stattya potrebuye uporyadkuvannya dlya vidpovidnosti standartam yakosti Vikipediyi Bud laska dopomozhit polipshiti cyu stattyu Mozhlivo storinka obgovorennya mistit zauvazhennya shodo potribnih zmin Klasichnij algoritm U klasichnomu varianti zaproponovanomu Goarom z masivu obirali odin element a ves masiv rozbivali na dvi chastini za principom u pershij chastini ne bilshi za danij element v drugij ne menshi za danij element Procedura Q u i c k s o r t A p q displaystyle Quicksort A p q zdijsnyuye chastkove vporyadkuvannya masivu A displaystyle A z p go po q j indeks Q u i c k s o r t A p q displaystyle Quicksort A p q 1 if p q displaystyle p geq q return 2 r A p displaystyle r gets A p 3 i p 1 displaystyle i gets p 1 4 j q 1 displaystyle j gets q 1 5 while i lt j displaystyle i lt j do 6 repeat 7 i i 1 displaystyle i gets i 1 8 until A i r displaystyle A i geq r 9 repeat 10 j j 1 displaystyle j gets j 1 11 until A j r displaystyle A j leq r 12 if i lt j displaystyle i lt j 13 then Swap A i A j displaystyle A i leftrightarrow A j 14 Q u i c k s o r t A p j 1 displaystyle Quicksort A p j 1 15 Q u i c k s o r t A j 1 q displaystyle Quicksort A j 1 q Suchasnij algoritm Nini v standartnih bibliotekah vikoristovuyut taku realizaciyu algoritmu P a r t i t i o n A p q displaystyle Partition A p q 1 x A q displaystyle x gets A q 2 i p 1 displaystyle i gets p 1 3 for j p displaystyle j gets p to q 1 displaystyle q 1 4 do if A j x displaystyle A j leq x 5 then 6 i i 1 displaystyle i gets i 1 7 Swap A i A j displaystyle A i leftrightarrow A j 8 Swap A i 1 A q displaystyle A i 1 leftrightarrow A q 8 return i 1 displaystyle i 1 Funkciya Partition povertaye indeks z opornim elementom sho rozdilyaye masiv na dvi chastini livu elementi yakoyi menshe opornogo elementu i pravu elementi yakoyi bilshe opornogo elementu Vseredini funkciyi opornim elementom vibirayetsya ostannij element masivu i obhid zdijsnyuyetsya pochinayuchi z pershogo elementu pririvnyuyuchi jogo do opornogo Q u i c k s o r t A p q displaystyle Quicksort A p q 1 if p q displaystyle p geq q return 2 i P a r t i t i o n A p q displaystyle i gets Partition A p q 3 Q u i c k s o r t A p i 1 displaystyle Quicksort A p i 1 4 Q u i c k s o r t A i 1 q displaystyle Quicksort A i 1 q AnalizChas roboti algoritmu sortuvannya zalezhit vid zbalansovanosti sho harakterizuye rozbittya Zbalansovanist u svoyu chergu zalezhit vid togo yakij element obrano yak opornij vidnosno yakogo elementa vikonuyetsya rozbittya Yaksho rozbittya zbalansovane to asimptotichno algoritm pracyuye tak samo shvidko yak i algoritm sortuvannya zlittyam U najgirshomu vipadku asimptotichna povedinka algoritmu nastilki zh pogana yak i v algoritmu sortuvannya vklyuchennyam Najgirshe rozbittya Najgirsha povedinka maye misce u tomu vipadku koli procedura sho vikonuye rozbittya porodzhuye odnu pidzadachu z n 1 elementom a drugu z 0 elementami Nehaj take nezbalansovane rozbittya vinikaye pri kozhnomu rekursivnomu vikliku Dlya samogo rozbittya potriben chas 8 n displaystyle Theta n Todi rekurentne spivvidnoshennya dlya chasu roboti mozhna zapisati tak T n T n 1 T 0 8 n T n 1 8 n displaystyle T n T n 1 T 0 Theta n T n 1 Theta n Rozv yazkom takogo spivvidnoshennya ye T n 8 n 2 displaystyle T n Theta n 2 Najkrashe rozbittya V najkrashomu vipadku procedura Partition dilit zadachu na dvi pidzadachi rozmir kozhnoyi ne perevishuye n 2 Chas roboti opisuyetsya nerivnistyu T n 2 T n 2 8 n displaystyle T n leq 2T n 2 Theta n Todi T n O n log n displaystyle T n O n log n asimptotichno najkrashij chas Serednij vipadok Matematichne ochikuvannya chasu roboti algoritmu na vsih mozhlivih vhidnih masivah ye O n log n displaystyle O n log n tobto serednij vipadok blizhchij do najkrashogo ModifikaciyiV serednomu algoritm pracyuye duzhe shvidko ale na praktici ne vsi mozhlivi vhidni masivi mayut odnakovu imovirnist Todi shlyahom dodannya randomizaciyi vdayetsya otrimati serednij chas roboti v bud yakomu vipadku Randomizovannij algoritm V randomizovannomu algoritmi pri kozhnomu rozbitti vipadkovij element obirayetsya yak opornij R a n d o m i z e d P a r t i t i o n A p q displaystyle Randomized Partition A p q 1 i R a n d o m p q displaystyle i leftarrow Random p q 2 Pominyati A i A q displaystyle A i leftrightarrow A q 9 return P a r t i t i o n A p q displaystyle Partition A p q R a n d o m i z e d Q u i c k s o r t A p q displaystyle Randomized Quicksort A p q 1 if p q displaystyle p geq q return 2 i R a n d o m i z e d P a r t i t i o n A p q displaystyle i gets Randomized Partition A p q 3 R a n d o m i z e d Q u i c k s o r t A p i 1 displaystyle Randomized Quicksort A p i 1 4 R a n d o m i z e d Q u i c k s o r t A i 1 q displaystyle Randomized Quicksort A i 1 q Realizaciya movoyu PascalCej rozdil ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cej rozdil dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno zhovten 2016 Cya procedura pislya yiyi ogoloshennya sortuye masiv mas yakij skladayetsya z elementiv tipu integer Procedure QuickSort first last integer Var v x left right integer begin left first right last v mas left right div 2 while left lt right do begin while mas left lt v do left left 1 while mas right gt v do right right 1 if left lt right then begin x mas left mas left mas right mas right x left left 1 right right 1 end end if first lt right then QuickSort first right if left lt last then QuickSort left last end Realizaciya movoyu C Cej rozdil ne mistit posilan na dzherela Vi mozhete dopomogti polipshiti cej rozdil dodavshi posilannya na nadijni avtoritetni dzherela Material bez dzherel mozhe buti piddano sumnivu ta vilucheno traven 2021 Cya funkciya sortuye masiv array sho mistit n elementiv de right n 1 right left 1 1 dlya togo abi u vikliku QuickSort array 0 1 opornim elementom vibiravsya pravij element sho ne dopustit sprobu dekrementuvati j koli cya zminna vzhe rivna 0 template lt typename T gt void QuickSort T array size t const left size t const right static T temp size t i left j right T pivot array left right left 1 gt gt 1 while i lt j while array i lt pivot i while array j gt pivot j if i lt j temp array i array i array j array j temp i j if j gt left QuickSort array left j if i lt right QuickSort array i right Realizaciya movoyu JavaScriptFunkciya quickSort prijmaye masiv arr yak vhidnij parametr i povertaye vidsortovanij masiv function quickSort arr if arr length lt 1 return arr const pivot arr Math floor arr length 2 const less const greater for let i 0 i lt arr length i if arr i lt pivot less push arr i else if arr i gt pivot greater push arr i return quickSort less pivot quickSort greater Priklad vikoristannya const array 5 3 1 6 2 4 const sortedArray quickSort array console log sortedArray Rezultat 1 2 3 4 5 6 Realizaciya movoyu RubyMetod quick sort prijmaye masiv arr yak vhidnij parametr i povertaye vidsortovanij masiv def quick sort arr return arr if arr length lt 1 pivot arr arr length 2 less greater arr each do element if element lt pivot less lt lt element elsif element gt pivot greater lt lt element end end return quick sort less pivot quick sort greater end Priklad vikoristannya array 5 3 1 6 2 4 sorted array quick sort array puts sorted array Rezultat 1 2 3 4 5 6 PrimitkiTimeline of Computer History 1960 Computer History Museum Arhiv originalu za 25 chervnya 2013 Procitovano 5 sichnya 2009 T Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 Rozdil 7 Shvidke sortuvannya Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 T Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 Rozdil 7 Shvidke sortuvannya Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 Priklad QuickSort algoritmu JavaScript tseivo com Procitovano 5 lipnya 2023 Priklad QuickSort algoritmu Ruby tseivo com Procitovano 5 lipnya 2023 LiteraturaT Kormen Ch Lejzerson R Rivest K Stajn 2009 1990 7 Shvidke sortuvannya Vstup do algoritmiv vid 3rd MIT Press i McGraw Hill ISBN 0 262 03384 4 PosilannyaRealizaciya algoritmu shvidkogo sortuvannya riznimi movami programuvannya 7 lyutogo 2015 u Wayback Machine Realizaciyi algoritmu shvidkogo sortuvannya riznimi movami programuvannya v stili gramotnogo programuvannya 9 travnya 2008 u Wayback Machine Animated Sorting Algorithms Quick Sort grafichna demonstraciya roboti algoritmu Animated Sorting Algorithms 3 Way Partition Quick Sort grafichna demonstraciya algoritmu shvidkogo sortuvannya z rozbittyam masivu na tri chastini Naochna demonstraciya shvidkogo sortuvannya ugorskimi tancyuristami 7 chervnya 2014 u Wayback Machine Interactive Tutorial for Quicksort 3 lyutogo 2009 u Wayback Machine