Algoritmus řazení

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 8. března 2020; ověření vyžaduje 41 úprav .

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.

Historie

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] .

Problémové prohlášení

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] .

Vyhodnocení algoritmu řazení

Třídicí algoritmy jsou hodnoceny pro rychlost provádění a efektivitu paměti:

O ( n log n ) optimalita obecně

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]

Vlastnosti a typy

Další důležitou vlastností algoritmu je jeho rozsah. Existují dva hlavní typy objednávek:

Algoritmy jsou také klasifikovány podle:

Přehled nejpopulárnějších třídicích algoritmů

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ů

Třídicí řetězce

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".

Viz také

Poznámky

  1. 1 2 Knuth, 2007 , str. 416.
  2. Knuth, 2007 , str. 417.
  3. Knuth, 2007 , str. 417-418.
  4. 1 2 3 Knut, 2007 , str. 418.
  5. 1 2 Knuth, 2007 , str. 419.
  6. Knuth, 2007 , str. 420.
  7. Knuth, 2007 , str. 420-421.
  8. Knuth, 2007 , str. 421.
  9. 1 2 Knuth, 2007 , str. 422.
  10. 1 2 3 4 Knut, 2007 , str. 22.
  11. Knuth, 2007 , str. 23.
  12. Han, Yijie. Deterministické třídění v O(n log log n) čase a lineárním prostoru  //  Journal of Algorithms. Poznání, informatika a logika. - 2004. - T. 50 , č. 1 . - S. 96-105 . - doi : 10.1016/j.jalgor.2003.09.001 .
  13. Donald Knuth. 5.3.1. Řazení s minimálním počtem srovnání // The Art of Programming. - 2. — Williams, 2002.
  14. Knuth, 2007 .

Literatura

Odkazy