Fig 4: flet sortering (med tilladelse fra https://commons.wikimedia.org/wiki/File:Merge_sort_algorithm_diagram.svg)Flet sortering fungerer på den anden side efter et grundlæggende princip: det er meget let at flette allerede sorterede arrays. Så, det opdeler en start array i halve igen og igen, indtil det er intet andet end enkelte elementer. Derefter genopbygger den langsomt hovedarrayet ved at flette disse elementer sammen igen i sorteret rækkefølge. Fordi vi startede fra byggesten i størrelse en, var det meget let at bygge indledende sorterede arrays. Derefter er det let at flette dem. I sidste ende bruger vi O(n log n) tid, og (vigtigere) gør vi det på en måde, der garanteres at være stabil.
for eksempel implementeringer se:
Flet sortering:https://www.geeksforgeeks.org/merge-sort/
Indsætningssortering:https://www.geeksforgeeks.org/insertion-sort/
Implementer Tim Sort
nøglen til at forstå Tim sorteres implementering er at forstå brugen af kørsler. Tim Sort udnytter naturligt forekommende presorted data til sin fordel. Ved presorted mener vi simpelthen, at sekventielle elementer er alle stigende eller faldende (vi er ligeglad med hvilke).
først indstiller vi enminrun
størrelse. Hvad vi mener med dette er, at vi ønsker at sikre, at alle vores kørsler er mindst en vis længde. Bemærk, at vi ikke garanterer, at vi finder kørsler af denne størrelse — vi kommer ind på dette senere. Vi siger simpelthen, at et løb skal være mindst af en vis længde.
når vi støder på et løb, sætter vi det til side. Når vi finder det længste løb inden for et minrun
rækkevidde. Vi har nu en velkendt datastruktur: et lille, sorteret array. Hvis det er mindst minrun
i længden, så huvah! Vi er gode til at komme videre. Hvis det ikke er tilfældet, sætter vi indsættelsessortering i spil.
Du kan huske ovenfra, at indsættelsessortering er særlig effektiv på to typer arrays: små og allerede sorterede. Det, vi lige har lavet, er et lille, sorteret array. Hvis det ikke er mindst minrun
i længden, når vi frem og tager nok andre elementer til at fuldføre løbet, og brug derefter Indsætningssortering til at skubbe dem ind i vores sorterede array, hurtigt og nemt. Selvfølgelig, hvis et løb møder slutningen af arrayet, kan du lade det være lidt kort.
når du har oprettet alle dine kørsler (dvs.sorterede subarrays), bruger du din Fletningssortering til at slutte dem sammen. I bedste fald er hele arrayet allerede sorteret, og Tim Sort er smart nok til at vide, at det ikke behøver at gøre noget andet. Andre gange har det en tendens til bare at være ekstremt effektivt. Som en ekstra fordel er både Indsætningssortering og Fletningssortering stabile, så det resulterende array er stabilt.
for dem, der foretrækker kugler:
- Opret en
minrun
størrelse, der er en effekt på 2 (normalt 32, aldrig mere end 64, eller din indsættelsessortering mister effektivitet)
- Find et løb i den første
minrun
af data.
- hvis løbet ikke er mindst
minrun
i længden, skal du bruge Indsætningssortering til at gribe efterfølgende eller tidligere emner og indsætte dem i løbet, indtil det er den korrekte minimumsstørrelse.
- gentag, indtil hele arrayet er opdelt i sorterede underafsnit.
- Brug den sidste halvdel af Fletningssortering til at deltage i de bestilte arrays.
konklusion
Tim Sort er kraftfuld. Det er hurtigt og stabilt, men måske vigtigst det udnytter virkelige verden mønstre og udnytter dem til at bygge et slutprodukt. Er det til enhver situation? Sikkert ikke. Held og lykke med at programmere det på en tavle under en samtale, og hvis du bare har brug for en hurtig enkel sorteringsalgoritme i en knivspids, vil du sandsynligvis ikke gider at implementere noget dette kompleks. Men for dataforskere, der knuser tal, er det mere end et kig værd.
for de nysgerrige kan du tjekke hele Tim Sorteringskoden på github.
Tak
tak en og alle til mine læsere. Jeg sætter pris på din tid, og håber inderligt, at du fandt indholdet informativt. Hvis du har spørgsmål eller svar, er du velkommen til at droppe et nedenfor.