Lajittelualgoritmivertailuun
Lajittelualgoritmit ovat tärkeä osa tiedon hallintaa. AtCprogramming.com, tarjoamme tutorials ymmärtämiseen tärkeimmät javiestintätekniikoita. Jokaisella algoritmilla on erityisiä vahvuuksia ja heikkouksia, ja monissa tapauksissa parasta on vain käyttää sisäänrakennettua qsort-toimintoa. Aikoja, jolloin tämä ei ole vaihtoehto tai tarvitset vain nopean ja likaisen lajittelualgoritmin, on olemassa erilaisia vaihtoehtoja.
useimmat lajittelualgoritmit toimivat vertaamalla lajiteltavaa dataa. Joissakin tapauksissa voi olla suotavaa lajitella suuri osa tiedoista (esimerkiksi nimi ja osoite sisältävä rakenne), joka perustuu vain osaan kyseisistä tiedoista.Tietoa, jota käytetään lajitellun järjestyksen määrittämiseen, kutsutaan avaimeksi.
lajittelualgoritmeja arvioidaan yleensä niiden tehokkuuden perusteella. Tässä tapauksessa tehokkuudella tarkoitetaan algoritmisen tehokkuuden suuruutta, kun syötön koko kasvaa suureksi ja se perustuu yleensä lajitettavien elementtien määrään. Useimmilla käytössä olevilla algoritmeilla on algoritminen hyötysuhde joko O(n^2) orO(n*log(n)). Muutamat erikoistapausalgoritmit (yksi esimerkki mainitaan Ohjelmointihelmissä) voivat lajitella tiettyjä tietojoukkoja nopeammin kuin O(n*log(n)). Thesealgoritmit eivät perustu vertaamalla kohteita lajitellaan ja luottaa rasteja. On osoitettu, että mikään avainvertailualgoritmi ei voi suorittaa parempaa suoritusta kuin O (n * log (n)).
monilla algoritmeilla, joilla on sama hyötysuhde, ei ole samaa nopeutta samalla syötteellä. Ensinnäkin algoritmeja on arvioitava niiden keskimääräisen tapauksen,parhaan tapauksen ja huonoimman tapauksen tehokkuuden perusteella. Jotkut algoritmit,kuten nopea lajittelu, toimivat poikkeuksellisen hyvin joillekin panoksille, mutta hirvittävästi toisille. Otheralgoritmit, kuten merge sort, eivät vaikuta syöttötietojen järjestykseen.Jopa muokattu versio kupla lajitella voi lopettaa O (n) mostfavorable tuloa.
toinen tekijä on ”vakiotermi”. Koska big – O notaatio abstrakteja pois monet yksityiskohdat prosessin, se on varsin hyödyllinen tarkasteltaessa bigpicture. Mutta yksi asia, joka jää pois, on vakio ilmaisun edessä: esimerkiksi O(c*n) on vain O(n). Todellisessa maailmassa, theconstant, c, vaihtelee eri algoritmeja. Hyvin toteutetussa quicksortissa pitäisi olla paljon pienempi vakiokerroin kuin heap sortissa.
toinen kriteeri algoritmien arvioimisessa on niiden avaruustarve – vaativatko ne tyhjästä tilaa vai voidaanko array lajitella paikalleen (ilman lisämuistia muutaman muuttujan lisäksi)? Jotkut algoritmit eivät koskaan vaadiextra tilaa, kun taas jotkut ovat helpoimmin ymmärrettäviä, kun toteutetaan withextra tilaa (heap lajitella, esimerkiksi, voidaan tehdä paikallaan, mutta käsitteellisesti se on paljon helpompi ajatella erillinen heap). Tilavaatimukset voivat jopa riippua käytetystä tietorakenteesta (merge Lajittele taulukoissa vs. merge Lajittele linkitetyissä luetteloissa, esimerkiksi).
kolmas kriteeri on stabiilisuus-säilyykö lajissa Keysin yhtäläiset arvot? Useimmat yksinkertaiset lajittelijat tekevät juuri tämän, mutta jotkut lajittelijat, kuten Heap Lajittele, eivät.
seuraavassa kaaviossa verrataan lajittelualgoritmeja yllä esitettyihin eri kriteereihin; algoritmit, joilla on korkeammat vakiotermit, näkyvät ensin, vaikka tämä on selvästi toteutuksesta riippuvainen käsite, ja niitä tulisi käyttää vain karkeana oppaana, kun poimitaan saman Big-O-hyötysuhteen tyyppien välillä.
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) | O(n^2) | vakio | vakaa | jopa täydellisesti järjestetty tulo vaatii koko joukon skannaamisen | Insertion Sort | O(n^2) | o(n) | O(n^2) | vakio | vakaa | parhaassa tapauksessa (jo lajiteltu) jokainen insertti vaatii vakioajan | kasojen lajittelu | o(n*log(n)) | o(n*Log(n)) | o(n*log(n))) | o (n * log (n))) | o (n * log (n))) | td> | instable | käyttämällä tulorivistöä kasan tallennustilana on mahdollista saavuttaa vakioavaruus |
merge Sort | O(n*log(n)) | O(n*log(n)) | o(n*log(n))) | riippuu | vakaa | on Array, merge sort vaatii O(N) space; linkitetyillä listoilla merge sort vaatii vakioavaruuden | |
Quicksort | o(n*log(n)) | o(n^2) | vakio | vakaa | satunnainen valinta pivot-arvoksi (tai rivin sekoittaminen ennen lajittelua) voi auttaa välttämään huonoimmat skenaariot, kuten täydellisesti lajitellut ryhmät. |