Smoothsort är en urvalssorteringsalgoritm , en sorts heapsortering , utvecklad av E. Dijkstra 1981. Liksom heapsort har den en komplexitet i värsta fall av O ( n log n ) . Fördelen med smoothsort är att dess komplexitet närmar sig O( n ) om inmatningen är delvis sorterad, medan heapsort alltid har samma komplexitet, oavsett tillståndet för inmatningen.
Precis som med heapsort ackumuleras en hög med data i en array, som sedan sorteras genom att kontinuerligt ta bort det maximala från högen. Till skillnad från heapsort använder den inte en binär hög , utan en speciell som erhålls med hjälp av Leonardo-tal . En hög består av en sekvens av högar, vars storlek är lika med ett av Leonardo-talen, och rötterna lagras i stigande ordning. Fördelen med sådana speciella högar framför binära är att om sekvensen sorteras kommer det att ta O( n ) tid att skapa och förstöra den, vilket är snabbare. Att dela upp indata i högar är enkelt: noderna längst till vänster i arrayen kommer att utgöra den största högen, och de återstående kommer att delas upp på liknande sätt.
Dessa påståenden kan bevisas.
Varje hög med storlek L( x ) består, från vänster till höger, av en underhög av storlek L( x − 1 ) , en underhög av storlek L( x − 2 ) och en rot, utom högar av storlek L(1 ). ) och L(0) , som endast består av roten. För varje hög gäller följande egenskap: värdet på roten måste vara minst lika stort som värdena på rötterna för dess underhögar (och, som ett resultat, inte mindre än värdena för alla noder av dess barnhögar). För en sekvens av högar gäller i sin tur följande egenskap: värdet på roten av varje hög måste vara minst lika stort som värdet på roten på högen till vänster. Konsekvensen av detta är att noden längst till höger i sekvensen kommer att ha det högsta värdet, och viktigare är att en delvis sorterad array inte behöver omarrangeras för att bli en riktig heapsekvens. Detta är källan till algoritmens anpassningsförmåga. Algoritmen är enkel. Först delas den osorterade matrisen i en hög med ett element och en osorterad del. En hög med ett element är uppenbarligen en riktig sekvens av högar. Sekvensen börjar växa genom att lägga till ett element från höger i taget (vid behov byts elementen så att heap-egenskapen och sekvensegenskapen håller) tills den når storleken på den ursprungliga arrayen. Och från och med nu kommer elementet längst till höger i sekvensen av högar att vara det största för någon hög, och kommer därför att vara i den korrekta, slutliga positionen. Högsekvensen reduceras sedan till en hög med ett element genom att ta bort noden längst till höger och flytta om elementen för att återställa tillståndet för högen. Så snart det finns en hög med ett element kvar kommer arrayen att sorteras.
Två operationer krävs: att öka högsekvensen genom att lägga till ett element till höger, och minska den genom att ta bort elementet längst till höger (roten av den sista högen), samtidigt som tillståndet för högen och sekvensen av högar bevaras.
Därefter måste egenskaperna för högen och sekvensen av högar återställas, vilket vanligtvis uppnås med en variant av insättningssort :
Sållningsoperationen förenklas avsevärt genom att använda Leonardo-nummer, eftersom varje hög antingen kommer att ha en singel eller två barn. Det finns ingen anledning att oroa sig för att missa en av barnhögarna.
OptimeringOm storleken på högen längst till höger är 1 – det vill säga det är en L(1) eller L(0) hög – så raderas den högen helt enkelt. Annars tas roten av den högen bort, de underordnade högarna behandlas som medlemmar av högsekvensen, och sedan kontrolleras högegenskapen, först för den vänstra högen, sedan för den högra.
OptimeringDen smidiga sorteringsalgoritmen kräver minne för att lagra storleken på alla högar i sekvensen. Eftersom alla dessa värden är olika, används vanligtvis en bitmapp för detta ändamål . Dessutom, eftersom det finns som mest O(log n ) -nummer i sekvensen, kan bitar kodas i O(1) maskinord, förutsatt att transdikotomimodellen används.
Sorteringsalgoritmer | |
---|---|
Teori | Komplexitet O notation Orderförhållande Sorteringstyper hållbar Inre Extern |
Utbyta | |
Val | |
skär | |
fusion | |
Inga jämförelser | |
hybrid | |
Övrig | |
opraktisk |