porovnání třídících algoritmů
třídící algoritmy jsou důležitou součástí správy dat. AtCprogramming.com, nabízíme výukové programy pro pochopení nejdůležitějších aspolečné techniky. Každý algoritmus má zvláštní silné stránky aslabosti a v mnoha případech je nejlepší použít vestavěnou funkci qsort. V době, kdy to není možnost, nebo jen potřebujeterychlý a špinavý algoritmus třídění, existuje celá řada možností.
Nejvíce třídící algoritmy pracují na základě porovnání dat je vyřešeno. V některých případech může být žádoucí třídit velký kus dat (například astruct obsahující jméno a adresu) na základě pouze části těchto dat.Část dat skutečně použitá k určení tříděného pořadí se nazývá klíč.
třídící algoritmy jsou obvykle posuzovány podle jejich účinnosti. V tomto případě efektivita označuje algoritmickou účinnost jako velikost vstupu growslarge a je obecně založena na počtu prvků, které se mají třídit. Většina používaných algoritmů má algoritmickou účinnost buď O (n^2) neboo (n * log(n)). Několik speciálních případových algoritmů (jeden příklad je uveden v programovacích perlách) dokáže třídit určité datové sady rychleji než O (n * log(n)). Ty nejsou založeny na porovnávání tříděných položek a spoléhají se na ně. Ukázalo se, že žádný algoritmus porovnávání klíčů nemůže fungovat lepšínež O (n * log(n)).
mnoho algoritmů, které mají stejnou účinnost, nemá stejnou rychlost na stejném vstupu. Za prvé, algoritmy musí být posuzovány na základě jejich průměrného případu, nejlepší případ, a účinnost nejhoršího případu. Některé algoritmy, například quick sort, fungují výjimečně dobře pro některé vstupy, ale strašně pro ostatní. Ostatní goritmy, jako například merge sort, nejsou ovlivněny pořadím vstupních dat.Dokonce i upravená verze bubble sort může skončit v O (n) pro nejpříznivější vstupy.
druhým faktorem je „konstantní termín“. Jak Big-O notace abstrakt pryč mnohodrobnosti procesu, to je docela užitečné při pohledu na bigpicture. Ale jedna věc, která vypadne, je konstanta před výrazem: například O (c*n) je jen O(n). V reálném světě, theconstant, c, se bude lišit v různých algoritmech. Dobře implementovanýquicksort by měl mít mnohem menší konstantní multiplikátor než třídění haldy.
druhým kritériem pro posuzování algoritmů je jejich požadavek na prostor – vyžadují scratch space nebo lze pole třídit na místě (bez další paměti nad rámec několika proměnných)? Některé algoritmy nikdy nevyžadujíextra prostor, zatímco některé jsou nejsnadněji pochopitelné, když jsou implementovány sextra prostor (například třídění haldy lze provést na místě, ale koncepčně je mnohem snazší myslet na samostatnou haldu). Požadavky na prostor mohou dokonce záviset na použité datové struktuře (například sloučit řazení na polích versus sloučit řazení na propojených seznamech).
třetím kritériem je stabilita – zachovává řazení pořadí klíčů se stejnými hodnotami? Většina jednoduchých druhů to dělá, ale některé druhy, jako napříkladlevné třídění, ne.
následující graf porovnává třídící algoritmy na různých kritériích uvedených výše; algoritmy s vyššími konstantními termíny se objevují jako první, ačkoli je to zjevně koncept závislý na implementaci a měl by být vzatjako hrubý průvodce při výběru mezi druhy stejné účinnosti big-O.
Time | |||||||
---|---|---|---|---|---|---|---|
Sort | Average | Best | Worst | Space | Stability | Remarks | |
Bubble sort | O(n^2) | O(n^2) | O(n^2) | Constant | Stable | Always use a modified bubble sort | |
Modified Bubble sort | O(n^2) | O(n) | O(n^2) | Constant | Stable | Stops after reaching a sorted array | |
Selection Sort | O(n^2) | O(n^2) | O(n^2) | Konstantní | Stabilní | I dokonale seřazené vstupní vyžaduje skenování celé pole | |
Vložení | O(n^2) | O(n) | O(n^2) | Konstantní | Stabilní | V nejlepším případě (vyřešeno), každý vložit vyžaduje konstantní čas | |
Heap Sort | O(n*log(n)) | O(n*log(n)) | O(n*log(n)) | Konstantní | Nestabilní | pomocí vstupního pole jako úložiště pro haldy, je možné dosáhnout konstantní prostor | |
Merge Sort | O(n*log(n)) | O(n*log(n)) | O(n*log(n)) | Záleží | Stabilní | Na pole, sloučit druh vyžaduje O(n) prostoru; na propojené seznamy, merge sort vyžaduje neustálé prostor | |
Quicksort | O(n*log(n)) | O(n*log(n)) | O(n^2) | Konstantní | Stabilní | Náhodně vybraný pivot hodnotu (nebo míchání pole před třídění) může pomoci vyhnout se nejhorším případě scénáře, stejně jako dokonale seřazené pole. |