Сортування змішуванням (англ. Cocktail sort) — один із різновидів алгоритму сортування бульбашкою. Відрізняється від сортування бульбашкою тим, що сортування відбувається в обох напрямках, міняючи напрямок при кожному проході. Цей алгоритм лише трішки складніший за сортування бульбашкою, однак, вирішує так звану проблему «черепах».
Клас | Алгоритм сортування |
---|---|
Структура даних | Масив |
Найгірша швидкодія | |
Найкраща швидкодія | |
Середня швидкодія | |
Оптимальний | Ні |
Швидкодія
Ефективність алгоритму рівна водночас для середнє статистичного та найгіршого випадку, однак, вона прямує до якщо список вже не погано відсортований, наприклад, якщо кожен елемент знаходиться у позиції, яка відрізняється від кінцевої більше, ніж на k (k ≥ 1), то його швидкодіє рівна .
Відмінності від сортування бульбашкою
Сортування змішуванням мало чим відрізняється від сортування бульбашкою. Єдина його відмінність у тому, що замість багаторазового проходження через список знизу вгору, він проходить по черзі знизу вгору і згори вниз. Він може досягати трохи вищої ефективності, ніж алгоритм сортування бульбашкою. Причиною цьому є те, що алгоритм сортування бульбашкою проходить по списку лише в одному напрямі, а тому за одну ітерацію елементи списку можна перемістити лише на один крок.
Наприклад, для того, щоб відсортувати список (2,3,4,5,1), алгоритму сортування змішуванням достатньо лише одного проходу, у той час, як алгоритму сортування бульбашкою знадобиться чотири проходи. Однак, один прохід сортування змішуванням слід рахувати за два проходи сортування бульбашкою. Зазвичай, сортування змішуванням удвічі швидше за сортування бульбашкою.
Іншою можливою оптимізацією є запам'ятовування попередніх перестановок. У наступній ітерації, перестановки не повторюватимуться, а тому алгоритм матиме коротші проходи по списку.
Приклади реалізації на різних мовах програмування
C++
#include <algorithm> template< typename Iterator > void cocktail_sort( Iterator first, Iterator last ) { while (last != first) { Iterator max = first; for ( Iterator i = first; i != last; ++i ) { if ( *(i + 1) < *i ) { std::iter_swap( i, i + 1 ); max = i; } } last = max; Iterator min = last; for ( Iterator i = last; i != first; --i ) { if ( *(i - 1) > *i ) { std::iter_swap( i, i - 1 ); min = i; } } first = min; } }
Java
public static void cocktailSort(int[] a) { int size = a.length; boolean swapped = false; for (int k = size - 1; k > 0; k--) { swapped = false; for (int i = k; i > size - 1 - k; i--) if (a[i] < a[i-1]) { // swap int temp = a[i]; a[i] = a[i-1]; a[i-1] = temp; swapped = true; } for (int i = size - k; i < k; i++) if (a[i] > a[i+1]) { // swap int temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; swapped = true; } if (!swapped) break; } }
Pascal
s:= 1; {Перший елемент масиву} e:= 25; {Останній елемент масиву} while e > s do begin for i:= s to e-1 do if Arr[i]>Arr[i+1] then begin tmp := Arr[i]; Arr[i] := Arr[i+1]; Arr[i+1] := tmp; c := c+1; end; for i:= e downto s+1 do if Arr[i] < Arr[i-1] then begin tmp := Arr[i]; Arr[i] := Arr[i-1]; Arr[i-1] := tmp; c := c+1; end; s:= s+1; e:= e-1; end;
Python
def cocktail_sort(A): for k in range(len(A)-1, 0, -1): swapped = False for i in range(k, 0, -1): if A[i]<A[i-1]: a = A[i] b = A[i-1] A[i] = b A[i-1] = a swapped = True for i in range(k): if A[i] > A[i+1]: a = A[i] b = A[i+1] A[i] = b A[i+1] = a swapped = True if not swapped: return A
JavaScript
const swap = (arr, i, j) => { const akum = arr[i] arr[i] = arr[j] arr[j] = akum } function shakerSort(array) { let leftIndex = 0 let rightIndex = array.length - 1 while (leftIndex < rightIndex) { for (let idx = leftIndex; idx < rightIndex; idx++) { if ( array[idx] > array[idx + 1]) { swap(array, idx, idx + 1) } } rightIndex--; for (let idx = rightIndex; idx > leftIndex; idx--) { if ( array[idx] < array[idx - 1]) { swap(array, idx, idx - 1) } } leftIndex++; } return array }
PHP
// $array - масив з числами for ($k = count($array) - 1; $k > 0; $k--) { $swapped = false; for ($i = 0; $i < $k; $i++) { if ($array[$i] > $array[$i + 1]) { $elem_a = $array[$i]; $elem_b = $array[$i + 1]; $array[$i] = $elem_b; $array[$i + 1] = $elem_a; $swapped = true; } } for ($i = $k; $i > 0; $i--) { if ($array[$i] < $array[$i - 1]) { $elem_a = $array[$i]; $elem_b = $array[$i - 1]; $array[$i] = $elem_b; $array[$i - 1] = $elem_a; $swapped = true; } } if (!$swapped) break; }
Посилання
- .NET Implementation of cocktail sort and several other algorithms
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Sortuvannya zmishuvannyam angl Cocktail sort odin iz riznovidiv algoritmu sortuvannya bulbashkoyu Vidriznyayetsya vid sortuvannya bulbashkoyu tim sho sortuvannya vidbuvayetsya v oboh napryamkah minyayuchi napryamok pri kozhnomu prohodi Cej algoritm lishe trishki skladnishij za sortuvannya bulbashkoyu odnak virishuye tak zvanu problemu cherepah Sortuvannya zmishuvannyamKlasAlgoritm sortuvannyaStruktura danihMasivNajgirsha shvidkodiyaO n 2 displaystyle O n 2 Najkrasha shvidkodiyaO n displaystyle O n Serednya shvidkodiyaO n 2 displaystyle O n 2 OptimalnijNiShvidkodiyaEfektivnist algoritmu rivna O n 2 displaystyle O n 2 vodnochas dlya serednye statistichnogo ta najgirshogo vipadku odnak vona pryamuye do O n displaystyle O n yaksho spisok vzhe ne pogano vidsortovanij napriklad yaksho kozhen element znahoditsya u poziciyi yaka vidriznyayetsya vid kincevoyi bilshe nizh na k k 1 to jogo shvidkodiye rivna O k n displaystyle O k n Vidminnosti vid sortuvannya bulbashkoyuSortuvannya zmishuvannyam malo chim vidriznyayetsya vid sortuvannya bulbashkoyu Yedina jogo vidminnist u tomu sho zamist bagatorazovogo prohodzhennya cherez spisok znizu vgoru vin prohodit po cherzi znizu vgoru i zgori vniz Vin mozhe dosyagati trohi vishoyi efektivnosti nizh algoritm sortuvannya bulbashkoyu Prichinoyu comu ye te sho algoritm sortuvannya bulbashkoyu prohodit po spisku lishe v odnomu napryami a tomu za odnu iteraciyu elementi spisku mozhna peremistiti lishe na odin krok Napriklad dlya togo shob vidsortuvati spisok 2 3 4 5 1 algoritmu sortuvannya zmishuvannyam dostatno lishe odnogo prohodu u toj chas yak algoritmu sortuvannya bulbashkoyu znadobitsya chotiri prohodi Odnak odin prohid sortuvannya zmishuvannyam slid rahuvati za dva prohodi sortuvannya bulbashkoyu Zazvichaj sortuvannya zmishuvannyam udvichi shvidshe za sortuvannya bulbashkoyu Inshoyu mozhlivoyu optimizaciyeyu ye zapam yatovuvannya poperednih perestanovok U nastupnij iteraciyi perestanovki ne povtoryuvatimutsya a tomu algoritm matime korotshi prohodi po spisku Prikladi realizaciyi na riznih movah programuvannyaC include lt algorithm gt template lt typename Iterator gt void cocktail sort Iterator first Iterator last while last first Iterator max first for Iterator i first i last i if i 1 lt i std iter swap i i 1 max i last max Iterator min last for Iterator i last i first i if i 1 gt i std iter swap i i 1 min i first min Java public static void cocktailSort int a int size a length boolean swapped false for int k size 1 k gt 0 k swapped false for int i k i gt size 1 k i if a i lt a i 1 swap int temp a i a i a i 1 a i 1 temp swapped true for int i size k i lt k i if a i gt a i 1 swap int temp a i a i a i 1 a i 1 temp swapped true if swapped break Pascal s 1 Pershij element masivu e 25 Ostannij element masivu while e gt s do begin for i s to e 1 do if Arr i gt Arr i 1 then begin tmp Arr i Arr i Arr i 1 Arr i 1 tmp c c 1 end for i e downto s 1 do if Arr i lt Arr i 1 then begin tmp Arr i Arr i Arr i 1 Arr i 1 tmp c c 1 end s s 1 e e 1 end Python def cocktail sort A for k in range len A 1 0 1 swapped False for i in range k 0 1 if A i lt A i 1 a A i b A i 1 A i b A i 1 a swapped True for i in range k if A i gt A i 1 a A i b A i 1 A i b A i 1 a swapped True if not swapped return A JavaScript const swap arr i j gt const akum arr i arr i arr j arr j akum function shakerSort array let leftIndex 0 let rightIndex array length 1 while leftIndex lt rightIndex for let idx leftIndex idx lt rightIndex idx if array idx gt array idx 1 swap array idx idx 1 rightIndex for let idx rightIndex idx gt leftIndex idx if array idx lt array idx 1 swap array idx idx 1 leftIndex return array PHP array masiv z chislami for k count array 1 k gt 0 k swapped false for i 0 i lt k i if array i gt array i 1 elem a array i elem b array i 1 array i elem b array i 1 elem a swapped true for i k i gt 0 i if array i lt array i 1 elem a array i elem b array i 1 array i elem b array i 1 elem a swapped true if swapped break Posilannya NET Implementation of cocktail sort and several other algorithms