Třídění bloků (Pocket sort, basket sort, angl. Bucket sort ) - třídící algoritmus , ve kterém jsou setříděné prvky rozděleny mezi konečný počet samostatných bloků (kapsy, košíky) tak, aby všech prvků v každém dalším bloku v pořadí bylo vždy více (nebo méně) než v předchozím. Každý blok se pak třídí samostatně, buď rekurzivně stejnou nebo jinou metodou. Prvky jsou poté zatlačeny zpět do pole . Tento typ řazení může mít lineární dobu provádění.
Tento algoritmus vyžaduje znalosti o povaze dat, která mají být tříděna, kromě funkcí „porovnat“ a „swap“, což je dostatečné pro třídění sloučení, třídění haldy, rychlé třídění, třídění shellu, třídění vkládání.
Výhody: patří do třídy rychlých algoritmů s lineární dobou provádění O(N) (při dobrých vstupních datech).
Nevýhody: hodně degraduje velkým množstvím málo odlišných prvků, nebo na neúspěšné funkci získání čísla košíku z obsahu prvku. V některých z těchto případů se u řetězců, které se vyskytují v implementacích kompresního algoritmu BWT založeného na třídění řetězců , ukazuje, že rychlé třídění řetězců v Sedgwicku je z hlediska rychlosti mnohem rychlejší než blockort .
Pokud jsou vstupní prvky rovnoměrně rozloženy , pak je očekávaná doba běhu algoritmu třídění kapes lineární. To je možné díky určitým předpokladům o vstupních datech. Pocketsort předpokládá, že vstupní data jsou rovnoměrně rozložena na intervalu [0, 1) .
Myšlenkou algoritmu je rozdělit segment [0, 1) na n identických segmentů (kapes) a do těchto kapes rozdělit n vstupních hodnot. Protože jsou vstupní čísla rovnoměrně rozdělena, předpokládá se, že každá kapsa bude spadat do malého počtu čísel. Potom se čísla v kapsách postupně třídí. Seřazené pole se získá postupným výpisem prvků každé kapsy.
Vstupem funkce bucket-sort je tříditelné pole (seznam, kolekce atd.) A a počet bloků - n .
Pole buckets je pole polí (pole seznamů, pole kolekcí atd.), které odpovídají povaze prvků A .
Funkce msbits(x,k) úzce souvisí s počtem bloků - n (vrací hodnotu od 0 do n) a obecně vrací k nejvýznamnějších bitů z x ( patro(x/2^(velikost (x)-k))) ). Jako msbits(x,k) lze použít různé funkce , které odpovídají povaze setříděných dat a umožňují rozdělení pole A na n bloků. Například pro znaky AZ to může být shoda s čísly písmen 0-25 nebo vrátit kód prvního písmene (0-255) znakové sady ASCII; pro čísla [0, 1) to může být funkční patro(n*A[i]) a pro libovolnou množinu čísel v intervalu [a,b) to může být funkční patro (n*(A[i ]-a)/(ba)) .
Funkce dalšího třídění také implementuje třídicí algoritmus pro každý blok vytvořený v prvním kroku. Rekurzivní použití bucket-sort jako dalšího řazení změní tento algoritmus na radixové řazení . V případě n = 2 odpovídá quicksortu (i když s potenciálně špatnou volbou pivotu).
Odhadněme složitost algoritmu třídění bloků pro případ, kdy je jako algoritmus třídění bloků použito řazení vkládání ( další řazení z pseudokódu) .
Abychom odhadli složitost algoritmu, zaveďme náhodnou veličinu n i , označující počet prvků, které spadnou do kapsy B[i]. Průběžná doba řazení vložení je .
Doba běhu algoritmu řazení v kapse je
Vypočítejme matematické očekávání obou částí rovnosti:
Pojďme najít hodnotu .
Zaveďme náhodnou proměnnou , která se rovná 1 , pokud spadne do i -té kapsy, a 0 v opačném případě: A[j]
Jestliže k ≠ j , X ij a X ik jsou nezávislé, tak:
Takto
Takže očekávaná doba běhu algoritmu řazení do kapsy je
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ý |