Lisäyslajittelu

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 22. marraskuuta 2019 tarkistetusta versiosta . tarkastukset vaativat 20 muokkausta .
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  - .

Kuvaus

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] .

Pseudokoodi

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 .

Algoritmianalyysi

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] .

Pahimman tapauksen analyysi

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äinen tapausanalyysi

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] .

Katso myös

Muistiinpanot

  1. Knut D. E. 5.2 Sisäinen lajittelu // Ohjelmoinnin taito. Osa 3. Lajittelu ja haku = The Art of Computer Programming. Osa 3. Lajittelu ja haku / toim. V. T. Tertyshny (luku 5) ja I. V. Krasikov (luku 6). - 2. painos - Moskova: Williams, 2007. - T. 3. - 832 s. — ISBN 5-8459-0082-1 .
  2. Kormen, 2013 , s. 38.
  3. Kormen, 2013 , s. 39.
  4. Knut D. E. 5.2.1 Lajittelu lisäysten mukaan // Ohjelmoinnin taito. Osa 3. Lajittelu ja haku = The Art of Computer Programming. Osa 3. Lajittelu ja haku / toim. V. T. Tertyshny (luku 5) ja I. V. Krasikov (luku 6). - 2. painos - Moskova: Williams, 2007. - T. 3. - 832 s. — ISBN 5-8459-0082-1 .
  5. 1 2 Cormen, 2013 , s. 39-40.
  6. N. Wirth. Algoritmit ja tietorakenteet. - M. : DMK Press, 2010. - S. 74. - 272 s. - ISBN 987-5-94074-584-6.
  7. Skiena S. Algoritmit. Kehittämisopas. - 2. - Pietari. : BHV-Petersburg, 2014. - S. 137. - 720 s. - ISBN 978-5-9775-0560-4 .
  8. 1 2 Aho, 2000 , s. 237.
  9. Kormen, 2013 , s. 47.
  10. Kormen, 2013 , s. 48.
  11. Kormen, 2013 , s. 48-49.
  12. Kormen, 2013 , s. 49.
  13. Kormen, 2013 , s. 49-50.
  14. McConnell, 2004 , s. 74.
  15. McConnell, 2004 , s. 75.
  16. McConnell, 2004 , s. 75-76.
  17. Kormen, 2013 , s. 51.

Kirjallisuus

Linkit