Block sort (Pocket sort, basket sort, ing. Bucket sort ) - algoritm de sortare , în care elementele sortate sunt distribuite într-un număr finit de blocuri separate (buzunare, coșuri) astfel încât toate elementele din fiecare bloc următor în ordine să fie întotdeauna mai multe (sau mai puțin) decât în precedentul. Fiecare bloc este apoi sortat separat, fie recursiv prin aceeași metodă, fie cu una diferită. Elementele sunt apoi împinse înapoi în matrice . Acest tip de sortare poate avea un timp de execuție liniar.
Acest algoritm necesită cunoștințe despre natura datelor care urmează să fie sortate, dincolo de funcțiile „comparare” și „swap”, suficiente pentru sortare prin îmbinare, sortare heap, sortare rapidă, sortare shell, sortare prin inserție.
Avantaje: aparține clasei de algoritmi rapizi cu timp de execuție liniar O(N) (pe date de intrare bune).
Dezavantaje: se degradează foarte mult cu un număr mare de elemente puțin diferite, sau pe funcția nereușită de a obține numărul coșului din conținutul elementului. În unele dintre aceste cazuri, pentru șirurile care apar în implementările algoritmului de compresie BWT bazat pe sortarea șirurilor , se dovedește că sortarea rapidă de șiruri de la Sedgwick este mult mai rapidă decât sortarea blocurilor.
Dacă elementele de intrare sunt distribuite uniform , atunci timpul de rulare așteptat al algoritmului de sortare de buzunar este liniar. Acest lucru este posibil datorită anumitor ipoteze despre datele de intrare. Pocketsort presupune că datele de intrare sunt distribuite uniform pe segmentul [0, 1) .
Ideea algoritmului este de a împărți segmentul [0, 1) în n segmente identice (buzunare) și de a împărți n valori de intrare în aceste buzunare. Deoarece numerele de intrare sunt distribuite uniform, se presupune că fiecare buzunar va cădea într-un număr mic de numere. Apoi numerele din buzunare sunt sortate secvenţial. O matrice sortată se obține prin listarea secvențială a elementelor fiecărui buzunar.
Intrarea funcției bucket-sort este o matrice sortabilă (listă, colecție etc.) A și numărul de blocuri - n .
Matricea buckets este o matrice de matrice (o matrice de liste, o matrice de colecții etc.) care se potrivesc cu natura elementelor lui A .
Funcția msbits(x,k) este strâns legată de numărul de blocuri - n (returnează o valoare de la 0 la n) și, în general, returnează cei mai semnificativi k biți din x ( floor(x/2^(size) (x)-k ))) ). Diferite funcții pot fi utilizate ca msbits(x,k) care se potrivesc cu natura datelor sortate și permit împărțirea matricei A în n blocuri. De exemplu, pentru caracterele AZ, aceasta ar putea fi o potrivire cu numerele de litere 0-25 sau poate returna codul primei litere (0-255) pentru setul de caractere ASCII; pentru numerele [0, 1) poate fi funcția floor(n*A[i]) , iar pentru o mulțime arbitrară de numere din intervalul [a, b) poate fi funcția floor (n*(A[i]) ]-a)/(ba )) .
Funcția de sortare următoare implementează, de asemenea, un algoritm de sortare pentru fiecare bloc creat în primul pas. Folosirea recursiv bucket-sort ca următoarea sortare transformă acest algoritm într-o sortare radix . În cazul lui n = 2 , corespunde sortării rapide (deși cu o alegere potențial slabă a pivotului).
Să estimăm complexitatea algoritmului de sortare a blocurilor pentru cazul în care sortarea prin inserție este utilizată ca algoritm de sortare a blocurilor (sortarea următoare din pseudocod) .
Pentru a estima complexitatea algoritmului, să introducem o variabilă aleatoare n i , care indică numărul de elemente care vor cădea în buzunar B[i]. Timpul de rulare a sortării prin inserare este .
Timpul de rulare al algoritmului de sortare de buzunar este
Să calculăm așteptările matematice ale ambelor părți ale egalității:
Să găsim valoarea .
Să introducem o variabilă aleatoare , care este egală cu 1 dacă se încadrează în al i -lea buzunar și 0 în caz contrar: A[j]
Dacă k ≠ j , X ij și X ik sunt independente, deci:
În acest fel
Deci, timpul de rulare estimat al algoritmului de sortare de buzunar este
Algoritmi de sortare | |
---|---|
Teorie | Complexitate O notație Relația de comandă Sortați tipuri durabil Intern Extern |
schimb valutar | |
Alegere | |
inserții | |
fuziune | |
Fara comparatii | |
hibrid | |
Alte | |
nepractic |