Sammenligning av Sorteringsalgoritmer
Sorteringsalgoritmer er en viktig del av behandlingen av data. AtCprogramming.com, tilbyr vi opplæringsprogrammer for å forstå de viktigste ogkommonsorting teknikker. Hver algoritme har spesielle styrker ogsvakheter, og i mange tilfeller er det best å bare bruke den innebygde funksjonen qsort. For tider når dette ikke er et alternativ, eller du bare trengeren rask og skitten sorteringsalgoritme, er det en rekke valg.
de fleste sorteringsalgoritmer fungerer ved å sammenligne dataene som sorteres. I noen tilfeller kan det være ønskelig å sortere en stor del data (for eksempel astruct som inneholder et navn og en adresse) basert på bare en del av disse dataene.Den delen av data som faktisk brukes til å bestemme den sorterte rekkefølgen kalles nøkkelen.
Sorteringsalgoritmer vurderes vanligvis av effektiviteten. I dette tilfellet refererer effektivitet til algoritmisk effektivitet som størrelsen på inngangen vokser stort og er generelt basert på antall elementer som skal sorteres. De fleste avalgoritmer i bruk har en algoritmisk effektivitet av Enten O (n^2) orO(n*log (n)). Noen få spesielle kasusalgoritmer (et eksempel er nevnt I Programmeringsperler) kan sortere visse datasett raskere Enn O(n*log (n)). Thesealgorithms er ikke basert på å sammenligne elementene som sorteres og stole påtricks. Det har blitt vist at ingen nøkkel-sammenligningsalgoritme kan utføre bedreenn O (n * log (n)).
Mange algoritmer som har samme effektivitet har ikke samme hastighet på samme inngang. Først må algoritmer vurderes basert på deres gjennomsnittlige case, best case og worst case effektivitet. Noen algoritmer,som rask sortering, utfører svært godt for noen innganger, men forferdelig for andre. Andrealgoritmer, for eksempel sammenslåing, påvirkes ikke av rekkefølgen på inndataene.Selv en modifisert versjon av boble sort kan fullføre I O (n) for de flestegunstige innganger.
en annen faktor er «konstant term». Som big – o notasjon abstracts bort mangeav detaljene i en prosess, er det ganske nyttig for å se på bigpicture. Men en ting som blir droppet ut er konstanten foran uttrykket: For Eksempel Er O (c * n)bare O (n). I den virkelige verden, c, vil variere på tvers av ulike algoritmer. En godt implementertquicksort bør ha en mye mindre konstant multiplikator enn heap sort.Et annet kriterium for å bedømme algoritmer er deres plassbehov-dothey krever skrapeplass eller kan arrayet sorteres på plass (uten ekstra minne utover noen få variabler)? Noen algoritmer krever aldriekstra plass, mens noen er lettest forstått når implementert medekstra plass(heap sort, for eksempel, kan gjøres på plass, men konseptueltdet er mye lettere å tenke på en egen haug). Plassbehov kan til og med avhenge av datastrukturen som brukes (slå sammen sortering på arrays versus slå sammen sortering onlinekoblede lister, for eksempel).
et tredje kriterium er stabilitet – bevarer sorteringen rekkefølgen av nøkler med like verdier? De fleste enkle sorter gjør nettopp dette, men noen slags, for eksempelbillig sort, ikke.
følgende diagram sammenligner sorteringsalgoritmer på de ulike kriteriene som er skissert ovenfor; algoritmene med høyere konstante vilkår vises først, skjønt dette er tydeligvis et implementeringsavhengig konsept og bør bare tas som en grov guide når du velger mellom slags samme big-o-effektivitet.
Time | |||||||||
---|---|---|---|---|---|---|---|---|---|
Sort | Average | Best | Worst | Space | Stability | Remarks | |||
Bubble sort | O(n^2) | O(n^2) | O(n^2) | Constant | Stable | Always use a modified bubble sort | |||
Modified Bubble sort | O(n^2) | O(n) | O(n^2) | Constant | Stable | Stops after reaching a sorted array | |||
Selection Sort | O(n^2) | O(n^2) | Konstant | Stabil | selv en perfekt sortert inngang krever skanning av hele arrayet | ||||
Innsetting Sort | O(n^2) | O(n) | O(n^2) | O(n) | O (n^2) beste fall(Allerede Sortert), krever hver innsats konstant tid | ||||
heap sort | o(n*logg(n)) | o(n*Logg(n)) | o(n*Logg (n)) | o (n * logg (n)) | o (n * logg (n)) | o (n * logg (n)) | td> | instable | ved Å Bruke input array som lagring for heap, er det mulig å oppnå konstant Plass |
merge sort | O(n*logg(n)) | O(n*logg(n)) | Avhenger | Stabil | På matriser, slå sammen sortering krever O(n) plass; på koblede lister, slå sammen sortering krever konstant plass | ||||
Quicksort | o(n*log(n)) | o(n*log(n)) | o(n^2) | konstant | stabil | tilfeldig plukke en pivotverdi(eller shuffling Matrisen før sortering) kan bidra til å unngå worst case scenarier som en perfekt sortert matrise. |