Přejít na hlavní obsah

Jak funguje třídění koktejlů: základní principy a příklady

Koktejlové třídění, také známé jako šejkrové třídění nebo míchací třídění, je třídicí algoritmus, který efektivně funguje k uspořádání polí čísel nebo jiných datových struktur. Charakteristickým rysem koktejlového třídění je, že kombinuje výhody bublinkového třídění a třídění výběrem, což mu umožňuje být efektivnější.

Hlavní myšlenkou koktejlového třídění je porovnávat a přeskupovat sousední prvky ve dvojicích, jako je řazení bublinou. Na rozdíl od bublinkového řazení však koktejlové řazení nejprve prochází polem zleva doprava a poté zprava doleva. Zužuje tedy oblast, ve které jsou prvky v nezařazeném stavu, takže je efektivnější a rychlejší.

Příklad fungování koktejlového třídění:

Uveďme příklad třídění pole čísel [5, 8, 1, 3, 6]:

Krok 1: Procházíme polem zleva doprava a porovnáváme sousední prvky. Pokud je aktuální prvek větší než další, vyměníme je.

[5, 8, 1, 3, 6] -> [5, 1, 8, 3, 6] -> [5, 1, 3, 8, 6] -> [5, 1, 3, 6, 8]

Krok 2: Procházíme polem zprava doleva a porovnáváme sousední prvky. Pokud je současný prvek menší než ten předchozí, vyměníme je.

[5, 1, 3, 6, 8] -> [5, 1, 3, 6, 8]

Kroky se opakují, dokud není pole zcela seřazeno. Koktejlové třídění tak umožňuje efektivní uspořádání pole a zároveň zachovává výhody dalších dvou oblíbených třídicích algoritmů.

Koktejlové třídění: základní principy a příklady

Základní myšlenkou koktejlového třídění je procházet masivem na obou stranách, nejprve zleva doprava, poté zprava doleva. Při každém průchodu jsou prvky porovnávány a měněny, pokud je to nutné, aby největší prvek "vyskočil" na konec pole a nejmenší prvek "klesl" na začátek pole. Po každém průchodu je tedy největší prvek na pravé straně pole, podobně nejmenší prvek na levé straně.

K realizaci koktejlového třídění lze použít cyklus while, který bude proveden, dokud nebude splněna podmínka, že mezi sebou nebudou vyměněny žádné prvky. Uvnitř cyklu je třeba projít pole na obou stranách, porovnat vedle sebe stojící prvky a v případě potřeby je vyměnit.

Vezměme si příklad koktejlového třídění na poli celých čísel:

Původní poleKrok 1Krok 2Krok 3
7294
2749
2479

V prvním kroku dochází k průchodu pole zleva doprava a dvojice prvků jsou v případě potřeby porovnány a zaměněny. Ve druhém kroku dochází k průchodu pole zprava doleva a podobné operace se provádějí. Po každém kroku se největší prvek přesune do pravé části pole a nejmenší prvek do levé části.

Koktejlové třídění je vylepšenou verzí bublinkového třídění a může být účinné při práci s neroztříděnými poli. Má obtížnost O (n^2), stejně jako bublinové řazení, ale v průměru je o něco rychlejší. U větších polí nebo polí s již seřazenými prvky jsou však efektivnější jiné třídicí algoritmy, jako je rychlé třídění nebo třídění sloučením.

Algoritmus třídění koktejlů

Algoritmus pro třídění koktejlů je založen na sekvenčním průchodu řadou prvků, porovnávání sousedních prvků a jejich výměně, pokud jsou v nesprávném pořadí. Tento proces se provádí na obou koncích pole, takže se nazývá obousměrný.

Algoritmus třídění koktejlů funguje následovně:

  1. Nastavíme proměnné "začátek" a "konec" rovnající se prvnímu a poslednímu indexu pole.
  2. Dokud je "začátek" menší než "konec", provádíme následující kroky:
    • Procházíme polem od "začátku" do "konce" a porovnáváme každý pár sousedních prvků. Pokud jsou v nesprávném pořadí, vyměníme je.
    • Snižte hodnotu "konec" o 1.
    • Procházíme polem od "konce" po "začátek" a porovnáváme každý pár sousedních prvků. Pokud jsou v nesprávném pořadí, vyměníme je.
    • Zvyšujeme hodnotu "Start" o 1.
  3. Opakujeme Krok 2, dokud" začátek "nebude větší nebo roven"konci".

Vzhledem k použití obousměrného průchodu je algoritmus třídění koktejlů účinnější než standardní řazení bublinkami. Může být použit k třídění polí jakékoli velikosti a má obtížnost O(n^2), kde n je počet prvků v poli.

Příklad kódu v jazyce C++ implementujícího algoritmus třídění koktejlů:

void cocktailSort(int arr[], int n) arr[i + 1]) >if (!swapped) swapped = false;// Проход справа налево--end;for (int i = end - 1; i >= start; --i) arr[i + 1]) >++start;>>

To jsou základní principy a příklady fungování algoritmu třídění koktejlů. Může být užitečný v situacích, kdy je třeba seřadit pole prvků a zachovat jeho relativní pořadí. Vzhledem k jeho složitosti O (n^2) se však nedoporučuje třídit velká pole.

Popis práce koktejlové třídění

Proces třídění začíná na levém konci pole a pohybuje se doprava. Poté, zprava doleva, dojde k zpětnému průchodu. Tento proces se opakuje, dokud v procesu průchodu nedojde k žádné výměně prvků místy, což znamená, že pole je již seřazeno.

Koktejlové třídění je účinné u částečně seřazených polí, protože dokáže rychle přesunout prvky do svých konečných pozic provedením průchodů oběma směry.

Dočasná složitost koktejlového třídění je O (n^2), kde n je počet prvků v seřazeném poli. Ke zlepšení výkonu algoritmu lze použít optimalizace, jako je" chytré třídění", které si zapamatuje poslední index, kde byla provedena výměna prvků, a další iterace začne procházet tímto indexem.