Lisäyslajittelu | |
---|---|
Lisäyslajitteluesimerkki | |
tarkoitus | Lajittelualgoritmi |
Tietorakenne | joukko |
pahin aika | O( n 2 ) vertailut, vaihdot |
Paras aika | O( n ) vertailua, 0 vaihtoa |
Keskimääräinen aika | O( n 2 ) vertailut, vaihdot |
Muistin hinta | O( n ) yhteensä, O( 1 ) apu |
Mediatiedostot Wikimedia Commonsissa |
Lisäyslajittelu on lajittelualgoritmi , jossa syöttösekvenssin elementit käydään läpi yksitellen ja jokainen uusi saapuva elementti sijoitetaan sopivaan paikkaan aiemmin järjestettyjen elementtien joukossa [ 1] . Laskennallinen monimutkaisuus - .
Algoritmin syöte on numerosarja: . Lajiteltuja numeroita kutsutaan myös avaimiksi . Syöttösekvenssi on käytännössä esitetty taulukkona elementeillä. Lähdössä algoritmin on palautettava alkuperäisen sekvenssin permutaatio , jotta seuraava relaatio toteutuu [2] .
Aluksi lajiteltu sarja on tyhjä. Algoritmin jokaisessa vaiheessa valitaan yksi syötetietoelementeistä ja sijoitetaan haluttuun kohtaan jo lajiteltuun sekvenssiin, kunnes syöttötietojoukko on käytetty loppuun. Elementit täyttävät missä tahansa vaiheessa lajiteltua sekvenssiä algoritmin ulostulolle asetetut vaatimukset [3] .
Tätä algoritmia voidaan nopeuttaa käyttämällä binäärihakua löytääksesi nykyisen elementin sijainnin lajitetussa osassa. Ongelma taulukon pitkästä siirtymisestä oikealle ratkaistaan vaihtamalla osoittimia [4] .
Lajitteluproseduurin syöte on taulukko , joka koostuu lajittelevista sekvenssin elementeistä . vastaa alkuperäisen taulukon kokoa. Lajittelu ei vaadi lisämuistia, paitsi vakioarvon yhdelle elementille, koska permutaatio suoritetaan taulukon sisällä. Proseduurin toiminnan seurauksena tarvittava elementtien lähtösekvenssi ilmestyy syöttötaulukkoon [5] .
Algoritmin pseudokoodi:
j = 2 - A. pituus do avain = A[j] i = j-1 kun taas (int i >= 0 ja A[i] > näppäin) do A[i + 1] = A[i] i = i - 1 lopettaa hetkeksi A[i+1] = avain loppu [5] | i = 2 - n do x = A[i] j = i kun taas (int j > 1 ja A[j-1] > x) tekevät A[j] = A[j-1] j = j - 1 lopettaa hetkeksi A[j] = x loppu [6] | A[0] = - kun i = 2 - n do j = i kun taas (j > 0 ja A[j] < A[j - 1]) vaihtavat ( A[j], A[j - 1]) j = j - 1 loppu ja loppu [7] [8] |
Viimeisessä versiossa vaihtoa x = A[j]; A[j] = A[j-1]; A[j-1] = xedustaa swap-toiminto, minkä vuoksi se on hieman hitaampi. Syötetyn A[0]:n arvo on pienempi kuin muiden elementtien [8] arvo .
Algoritmin suoritusaika riippuu syöttötiedoista: mitä suurempi lajiteltava joukko, sitä kauemmin lajittelu kestää. Myös taulukon alkuperäinen järjestys vaikuttaa suoritusaikaan. Algoritmin ajoaika samankokoisille eri tuloille riippuu suoritettavista perusoperaatioista tai vaiheista [9] .
Kullekin algoritmin käskylle esittelemme aikakustannukset ja toistojen lukumäärän, missä on ehtotarkistusten määrä while [10] -sisäsilmukassa :
Koodi | Hinta | Toistoja |
---|---|---|
kun j = 2 - A.pituus | ||
avain = A[j] | ||
i = j - 1 | ||
kun i > 0 ja A[i] > näppäin | ||
A[i+1] = A[i] | ||
i = i - 1 | ||
A[i+1] = avain |
Lisäyslajittelualgoritmin ajoaika on kunkin vaiheen ajoaikojen summa [11] : .
Edullisin tapaus on lajiteltu matriisi. Lisäksi kaikki sisäiset silmukat koostuvat vain yhdestä iteraatiosta, eli kaikille . Tällöin algoritmin ajoaika on . Ajoaika riippuu lineaarisesti syötetyn datan koosta [12] .
Pahin tapaus on matriisi, joka on lajiteltu käänteiseen järjestykseen. Tässä tapauksessa jokaista uutta elementtiä verrataan kaikkiin lajiteltuun sekvenssiin. Tämä tarkoittaa, että kaikki sisäiset silmukat koostuvat j-iteraatioista, eli kaikille . Sitten algoritmin ajoaika on:
.
Ajoaika on neliöfunktio syötetyn datan koosta [13] .
Keskimääräisen tapauksen analysoimiseksi sinun on laskettava seuraavan elementin sijainnin määrittämiseen tarvittavien vertailujen keskimääräinen määrä. Uutta elementtiä lisättäessä vaaditaan vähintään yksi vertailu, vaikka elementti olisi oikeassa paikassa. Lisättävä elementti voi olla jollakin paikasta. Jos oletetaan satunnaisia syötteitä, uusi elementti päätyy yhtä todennäköisesti mihin tahansa paikkaan [14] . Keskimääräinen vertailujen lukumäärä -: nnen elementin lisäämiseksi [15] :
Arvioiksesi n elementin keskimääräisen käyntiajan sinun on laskettava yhteen [16] :
Algoritmin aikamonimutkaisuus on . Vakiotekijöiden ja alhaisempien järjestysehtojen vuoksi korkeampi kasvujärjestysalgoritmi voi kuitenkin toimia nopeammin pienillä syötteillä kuin alhaisempi kasvujärjestysalgoritmi [17] .
Lajittelualgoritmit | |
---|---|
Teoria | Monimutkaisuus O merkintä Tilaussuhde Lajittele tyypit kestävää Sisäinen Ulkoinen |
Vaihto | |
Valinta | |
insertit | |
fuusio | |
Ei vertailuja | |
hybridi | |
muu | |
epäkäytännöllistä |