Smoothsort este un algoritm de sortare a selecției , un fel de sortare heap , dezvoltat de E. Dijkstra în 1981. La fel ca heapsort, are o complexitate în cel mai rău caz de O ( n log n ) . Avantajul smoothsort-ului este că complexitatea sa se apropie de O( n ) dacă intrarea este sortată parțial, în timp ce heapsort are întotdeauna aceeași complexitate, indiferent de starea intrării.
Ca și în cazul heapsort, o grămadă de date este acumulată într-o matrice, care este apoi sortată prin eliminarea continuă a maximului din heap. Spre deosebire de heapsort, nu folosește un heap binar , ci unul special obținut folosind numere Leonardo . O grămadă constă dintr-o succesiune de grămezi, ale căror dimensiuni sunt egale cu unul dintre numerele Leonardo, iar rădăcinile sunt stocate în ordine crescătoare. Avantajul unor astfel de grămezi speciale față de cele binare este că, dacă secvența este sortată, va dura O( n ) timp pentru ao crea și distruge, ceea ce este mai rapid. Împărțirea datelor de intrare în heap-uri este simplă: nodurile cele mai din stânga ale matricei vor alcătui cel mai mare heap, iar cele rămase vor fi împărțite într-un mod similar.
Aceste afirmații pot fi dovedite.
Fiecare grămada de mărimea L( x ) constă, de la stânga la dreapta, dintr-un subheap de dimensiunea L( x − 1 ) , un subhap de dimensiunea L( x − 2 ) și o rădăcină, cu excepția mormanilor de dimensiunea L(1 ). ) și L(0) , care constau numai din rădăcină. Pentru fiecare heap, este valabilă următoarea proprietate: valoarea rădăcinii trebuie să fie cel puțin la fel de mare ca și valorile rădăcinilor grămezilor sale copil (și, prin urmare, nu mai puțin decât valorile tuturor nodurilor grămele lui de copil). Pentru o secvență de grămezi, la rândul său, este valabilă următoarea proprietate: valoarea rădăcinii fiecărei grămezi trebuie să fie cel puțin la fel de mare ca valoarea rădăcinii grămezii din stânga. Consecința acestui lucru este că nodul cel mai din dreapta din secvență va avea cea mai mare valoare și, important, o matrice parțial sortată nu va trebui să fie rearanjată pentru a deveni o secvență heap adecvată. Aceasta este sursa de adaptabilitate a algoritmului. Algoritmul este simplu. În primul rând, matricea nesortată este împărțită într-un heap cu un element și o parte nesortată. O grămadă cu un element este, evident, o secvență adecvată de grămezi. Secvența începe să crească prin adăugarea câte un element din dreapta la un moment dat (dacă este necesar, elementele sunt schimbate astfel încât proprietatea heap și proprietatea secvenței să fie păstrate) până când ajunge la dimensiunea matricei originale. Și de acum înainte, elementul cel mai din dreapta din secvența de grămezi va fi cel mai mare pentru orice grămada și, prin urmare, va fi în poziția corectă, finală. Secvența heap este apoi redusă la un heap cu un element prin eliminarea nodului din dreapta și repoziționând elementele pentru a restabili starea heap-ului. De îndată ce există un heap cu un element rămas, matricea va fi sortată.
Sunt necesare două operații: creșterea secvenței heap prin adăugarea unui element la dreapta și scăderea acesteia prin eliminarea elementului din dreapta (rădăcina ultimului heap), păstrând în același timp starea heap-ului și secvența heap-urilor.
După aceea, proprietățile heap-ului și secvenței heap-urilor trebuie restaurate, ceea ce se realizează de obicei folosind o variație a sortării de inserție :
Operația de cernere este mult simplificată prin utilizarea numerelor Leonardo, deoarece fiecare grămadă fie va avea un singleton, fie va avea doi copii. Nu este nevoie să vă faceți griji că pierdeți unul dintre grămezi de copii.
OptimizareDacă dimensiunea heap-ului din dreapta este 1 - adică este un heap L(1) sau L(0) - atunci acel heap este pur și simplu șters. În caz contrar, rădăcina acelui heap este eliminată, heap-urile copil sunt tratate ca membri ai secvenței heap, iar apoi proprietatea heap este verificată, mai întâi pentru heap-ul stâng, apoi pentru dreapta.
OptimizareAlgoritmul de sortare uniformă necesită memorie pentru a stoca dimensiunile tuturor grămezilor din secvență. Deoarece toate aceste valori sunt diferite, o hartă de bit este de obicei utilizată în acest scop . De asemenea, deoarece există cel mult O(log n ) numere în secvență, biții pot fi codificați în cuvinte mașină O(1) , cu condiția să fie utilizat modelul transdihotomiei.
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 |