Algoritmus řazení je algoritmus pro řazení prvků v poli. V případě, že prvek v poli má více polí, pole, které slouží jako kritérium pořadí, se nazývá klíč řazení. V praxi číslo často funguje jako klíč a zbývající pole ukládají některá data, která neovlivňují činnost algoritmu.
První prototypy moderních metod třídění se objevily již v 19. století. V roce 1890 vytvořil Američan Herman Hollerith první statistický tabulátor , elektromechanický stroj určený k automatickému zpracování informací zaznamenaných na děrných štítcích, aby urychlil zpracování dat ze sčítání v USA [1] . Hollerithův stroj měl speciální „třídicí box“ s 26 vnitřními oddíly. Při práci se strojem byla obsluha povinna vložit děrný štítek a spustit rukojeť. Díky vyraženým otvorům na děrném štítku byl uzavřen určitý elektrický obvod a indikace číselníku s ním spojeného se zvýšila o jedničku. Současně bylo otevřeno jedno z 26 vík třídicího boxu a do odpovídajícího oddělení byl přesunut děrný štítek, načež bylo víko uzavřeno. Tento stroj umožnil zpracovat cca 50 karet za minutu, což zrychlilo zpracování dat 3x. Pro sčítání v roce 1900 Hollerith vylepšil stroj automatizací podávání karet [1] . Provoz Hollerithova třídicího stroje se opíral o radixové metody třídění . Strojní patent uvádí řazení „individuálně pro každý sloupec“, ale neuvádí pořadí. Další podobný stroj, patentovaný v roce 1894 Johnem Gorem, zmiňuje třídění ze sloupce desítek [2] . Metoda třídění, počínaje sloupcem jednotek, se poprvé objevuje v literatuře koncem 30. let 20. století [3] . V této době již třídicí stroje umožňovaly zpracovat až 400 karet za minutu [4] .
V budoucnu se ukázalo, že historie algoritmů je spojena s vývojem elektronických počítačů . Podle některých zdrojů se právě třídicí program stal prvním programem pro počítače. Někteří počítačoví designéři, zejména vývojáři EDVAC , označili problém třídění dat za nejtypičtější nenumerický úkol pro počítače. V roce 1945 John von Neumann vyvinul slučovací třídicí programy pro testování řady příkazů pro EDVAC . V témže roce německý inženýr Konrad Zuse vyvinul program pro jednoduché vkládání třídění . V této době se již objevily rychlé specializované třídičky, ve srovnání s nimiž byla hodnocena efektivita vyvinutých počítačů [4] . První publikovanou diskusí o třídění pomocí počítače byla přednáška Johna Mauchlyho v roce 1946. Mauchly ukázal, že třídění může být užitečné i pro numerické výpočty, popsal jednoduché metody řazení vkládáním a binárním vkládáním a radixové řazení s částečnými průchody. Později spoluzaložil Eckert-Mauchly Computer Corporation s inženýrem Johnem Eckertem, aby vyrobil některé z prvních elektronických počítačů BINAC a UNIVAC [5] . Spolu se známými vnitřními třídícími algoritmy se objevily i externí třídící algoritmy , jejichž vývoj byl usnadněn omezeným množstvím paměti prvních počítačů [4] . Zejména byly navrženy metody vyváženého dvoucestného bitového třídění a vyváženého dvoucestného slučování [5] .
V roce 1952 již bylo v praxi mnoho metod vnitřního třídění, ale teorie byla poměrně špatně rozvinutá [6] . V říjnu 1952 poskytl Daniel Goldenberg pět metod třídění s analýzou nejlepšího a nejhoršího případu pro každou z nich. V roce 1954 Harold Seward rozvinul Goldenbergovy myšlenky a také analyzoval externí metody třídění. Howard Demuth v roce 1956 uvažoval o třech abstraktních modelech problému řazení: pomocí kruhové paměti, lineární paměti a paměti s náhodným přístupem. Pro každý z těchto problémů autor navrhl optimální nebo téměř optimální metody třídění, které pomohly propojit teorii s praxí [7] . Vzhledem k malému počtu lidí spojených s výpočetní technikou se tyto zprávy v „otevřené literatuře“ neobjevily. První velký přehledový článek o třídění, který vyšel v tisku v roce 1955, byla práce J. Hoskena, ve které na základě prospektů výrobců popsal veškerá tehdy dostupná speciální zařízení a způsoby třídění pro počítače. V roce 1956 E. Friend ve své práci analyzoval matematické vlastnosti velkého počtu interních a externích třídicích algoritmů a navrhl některé nové metody [8] .
Od té doby bylo navrženo mnoho různých třídicích algoritmů: například výpočet adresy v roce 1956; merge with insertion, exchange radixsort , kaskádové merge a Shellova metoda v roce 1959, polyphase merge a tree insertions v roce 1960, oscilační řazení a Hoareho quicksort v roce 1962, Williamsův heapsort a exchangesort s Batcherovým sloučením v roce 1964. Koncem 60. let také došlo k intenzivnímu rozvoji teorie třídění [9] . Algoritmy, které se objevily později, byly v mnoha ohledech variacemi již známých metod. Rozšířily se metody adaptivního třídění zaměřené na rychlejší provádění v případech, kdy vstupní sekvence splňuje předem stanovená kritéria [9] .
klíč , který řídí proces třídění. Na sadě klíčů je definován vztah pořadí "<" tak, že pro všechny tři hodnoty klíče jsou splněny následující podmínky [10] :
Tyto podmínky definují matematický koncept lineárního nebo dokonalého uspořádání a množiny, které je splňují, lze třídit většinou metod [10] .
Úkolem třídění je najít takovou permutaci záznamů s indexy , za kterými by byly klíče umístěny v neklesajícím pořadí [10] :
Řazení se nazývá stabilní , pokud nemění vzájemnou polohu prvků se stejnými klíči [10] :
pro jakékoli a .Způsoby třídění lze rozdělit na interní a externí . Interní třídění se používá pro data, která se vejdou do paměti RAM, díky čemuž jsou z hlediska datových struktur flexibilnější. Při externím třídění nejsou data umísťována do RAM a je zaměřena na dosahování výsledků v podmínkách omezených zdrojů [11] .
Třídicí algoritmy jsou hodnoceny pro rychlost provádění a efektivitu paměti:
V obecném případě problém řazení předpokládá, že jedinou nezbytně dostupnou operací s prvky je porovnávání. Odpověď na porovnání prvků a může být jedna ze dvou možností: nebo . Pokud tedy algoritmus v průběhu práce provádí srovnání, existují pouze možné kombinace odpovědí na ně.
Počet permutací prvků je . Aby bylo možné surjektivně mapovat množinu kombinací odpovědí na množinu všech permutací, musí být počet srovnání alespoň (protože porovnání je jediná povolená operace).
Vezmeme- li logaritmus Stirlingova vzorce , můžeme zjistit, že [13]
Další důležitou vlastností algoritmu je jeho rozsah. Existují dva hlavní typy objednávek:
Algoritmy jsou také klasifikovány podle:
Algoritmus | Popis | Čas dokončení | Náklady na paměť | Poznámka | |
---|---|---|---|---|---|
Při nejhorším | Průměrný | Nejlepší scénář | |||
Perzistentní třídicí algoritmy | |||||
Bublinové řazení _ _ _ | Iteruje pole, porovnává po sobě jdoucí páry prvků a zaměňuje je, pokud jsou ve špatném pořadí. | V procesu třídění se v horní části pole „objeví“ minimální prvek, který připomíná bublinu | |||
Míchací druh ( angl. Cocktail sort ) | Obousměrné, optimalizované třídění bublin | ||||
Řazení vložení _ _ _ | Prvky vstupní sekvence jsou zkoumány jeden po druhém a každý nový prvek je umístěn na vhodné místo mezi dříve uspořádané prvky. | ||||
Gnome sorting ( angl. Gnome sort ) | Kříženec vkládání a bublinových druhů . | Název pochází z domnělého chování zahradních trpaslíků při třídění řady zahradních květináčů. | |||
Sloučit řazení _ _ _ | Rekurzivně seřadí poloviny pole a poté je spojí do jedné | ||||
Třídění pomocí binárního stromu ( angl. Tree sort ) | Na základě počátečních dat je vytvořen binární vyhledávací strom , ve kterém jsou postupně shromažďovány minimální hodnoty | ||||
Řazení Timsort _ _ _ _ | Kříženec řazení vložení a řazení sloučení . Vycházíme z předpokladu, že při řešení praktických problémů se vstupní pole často skládá z seřazených podpolí | ||||
Nestabilní třídicí algoritmy | |||||
Seřadit výběr _ _ _ | Rozdělí vstupní pole na uspořádané a neuspořádané části. Poté postupně přenese nejmenší prvky z druhé do první části. | ||||
Hřebenové řazení _ _ _ | Modifikace bublinového řazení , ve které je vzdálenost mezi porovnávanými dvojicemi hodnot jiná než 1 | Navzdory větší algoritmické složitosti bude pro nepříliš velké velikosti polí hřebenové řazení efektivnější než rychlé řazení . | |||
Shell seřadit _ _ _ | Modifikace řazení vložení , ve které je vzdálenost mezi porovnávanými dvojicemi hodnot jiná než 1 | ||||
Řazení haldy (třídění haldy, řazení haldy) | Na základě počátečních dat se sestaví binární halda , ve které se postupně shromažďují minimální hodnoty | ||||
Smoothsort _ _ _ _ | Úprava heapsortu , optimalizace řazení částečně uspořádaného pole | ||||
Rychlé třídění _ _ _ _ | Je vybrán referenční prvek p. Všechny klávesy menší než p se přesunou doleva a všechny klávesy větší nebo rovné p se přesunou doprava. Dále je algoritmus rekurzivně aplikován na každou z částí | ||||
Introspektivní třídění _ _ _ | Hybrid rychlého a velkého množství | ||||
Stupid sort ( eng. Stooge sort ) | V případě potřeby zamění první a poslední prvek pole. Poté rozdělí pole na tři části, z nichž každá běží rekurzivně |
|
Metoda je pojmenována po americké komediální skupině Three Stooges . Podobnost spočívá v tom, že algoritmus šíleně spěchá přes již seřazené třetiny pole. | ||
Nepraktické třídicí algoritmy | |||||
Bogosort | Pole je náhodně zamícháno, dokud není seřazeno. | Neomezený | Používá se pouze pro akademické účely | ||
Seřadit podle permutace | Vygenerují se všechny možné sekvence pole, ze kterých se vybere uspořádaná sekvence. | Používá se pouze pro akademické účely | |||
Gravitační třídění ( English Bead sort ) | Čísla jsou reprezentována jako korálky na špendlíkech, poté seřazená podle gravitace | Vyžaduje specializovaný hardware | |||
Algoritmy nejsou založeny na srovnání | |||||
Blokovat řazení _ _ _ | Prvky jsou rozděleny do bloků podle rozsahu hodnot, z nichž každá je pak rekurzivně tříděna | - předem stanovený počet košů | |||
Bitové řazení ( eng. Radix sort ) | Pole se třídí podle bitového porovnávání čísel | je počet bitů potřebných k uložení každého klíče. | |||
Počítání řazení _ _ _ | Počítá se počet výskytů každého celého čísla z rozsahu klíčů v poli. Poté se vytisknou hodnoty všech nenulových hodnot | - maximální hodnota klíčových prvků |
Jednou z běžných aplikací třídicích algoritmů je třídění řetězců. Zobecněný algoritmus může vypadat takto: nejprve je sada řetězců setříděna podle prvního znaku každého řetězce, poté je každá podmnožina řetězců, které mají stejný první znak, setříděna podle druhého znaku a tak dále, dokud nejsou seřazeny všechny řetězce. . V tomto případě je chybějící znak (při porovnávání řetězce délky N s řetězcem délky N + 1) považován za menší než jakýkoli znak.
Použití této metody na řetězce, které jsou čísly v přirozeném zápisu, poskytuje neintuitivní výsledky: například "9" je větší než "11", protože první znak prvního řetězce má větší hodnotu než první znak druhého. K vyřešení tohoto problému může třídicí algoritmus převést tříděné řetězce na čísla a seřadit je jako čísla. Takový algoritmus se nazývá „numerické řazení“ a dříve popsaný algoritmus se nazývá „řetězcové řazení“. V praxi je také účinným způsobem, jak vyřešit problém řazení řetězců obsahujících čísla, přidat před číslo určitý počet nul, takže "011" bude považováno za větší než "009".
Algoritmy řazení | |
---|---|
Teorie | Složitost O zápis Objednávkový vztah Seřadit typy udržitelného Vnitřní Externí |
Výměna | |
Výběr | |
vložky | |
fúze | |
Žádné srovnání | |
hybridní | |
jiný | |
nepraktický |