Beillesztési rendezés

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2019. november 22-én felülvizsgált verziótól ; az ellenőrzések 20 szerkesztést igényelnek .
Beillesztési rendezés

Beillesztési rendezési példa
célja Rendezési algoritmus
Adatstruktúra sor
legrosszabb idő O( n 2 ) összehasonlítások, cserék
Legjobb idő O( n ) összehasonlítás, 0 csere
Átlagos idő O( n 2 ) összehasonlítások, cserék
A memória költsége O( n ) összesen, O( 1 ) segéd
 Médiafájlok a Wikimedia Commons oldalon

A beszúrásos rendezés egy olyan rendezési algoritmus , amelyben  a bemeneti sorozat elemeit egyenként átnézik, és minden új bejövő elemet megfelelő helyre helyeznek a korábban rendezett elemek közé [1] . Számítási összetettség  - .

Leírás

Az algoritmus bemenete egy számsorozat: . A rendezett számokat kulcsoknak is nevezik . A bemeneti sorozat a gyakorlatban elemekkel ellátott tömbként van ábrázolva . A kimeneten az algoritmusnak vissza kell adnia az eredeti sorozat permutációját , hogy a következő összefüggés teljesüljön [2] .

Kezdetben a rendezett sorozat üres. Az algoritmus minden lépésében kiválasztásra kerül az egyik bemeneti adatelem, és a már rendezett sorrendben a kívánt pozícióba kerül, amíg a bemeneti adatkészlet ki nem merül. A rendezett sorozat bármely időpontjában az elemek kielégítik az algoritmus kimenetére vonatkozó követelményeket [3] .

Ez az algoritmus felgyorsítható bináris kereséssel, hogy megtalálja az aktuális elem helyét a rendezett részben. A tömb hosszú jobbra tolódásának problémáját a mutatók megváltoztatásával oldjuk meg [4] .

Pszeudokód

A rendezési eljárás bemenete egy tömb , amely a sorozat rendezendő elemeiből áll. megfelel  az eredeti tömb méretének. A rendezés nem igényel további memóriát, kivéve egy elem állandó értékét, mivel a permutáció a tömbön belül történik. Az eljárás működése következtében a bemeneti tömbben megjelenik a szükséges kimeneti elemek sorozata [5] .

Algoritmus pszeudokód:

mert j = 2 -től A. hossza do kulcs = A[j] i = j-1 míg (int i >= 0 és A[i] > gomb) nem A[i + 1] = A[i] i = i - 1 vége közben A[i+1] = kulcs vége [5] ha i = 2 -től n -ig csinálja x = A[i] j = i míg (int j > 1 és A[j-1] > x) igen A[j] = A[j-1] j = j - 1 vége közben A[j] = x vége: [6] A[0] = - i = 2 esetén n do j = i míg (j > 0 és A[j] < A[j - 1]) felcserélik ( A[j], A[j - 1]) j = j - 1 vége, míg vége a következőhöz: [7] [8]

Az utolsó verzióban a cserét x = A[j]; A[j] = A[j-1]; A[j-1] = xa csereművelet képviseli, emiatt kicsit lassabb. A beírt A[0] értéke kisebb, mint a többi elem [8] értéke .

Algoritmuselemzés

Az algoritmus végrehajtási ideje a bemeneti adatoktól függ: minél nagyobb a rendezendő halmaz, annál tovább tart a rendezés. A tömb kezdeti sorrendje is befolyásolja a végrehajtási időt. Az algoritmus futási ideje különböző, azonos méretű bemenetekre a végrehajtandó elemi műveletektől, lépésektől függ [9] .

Az algoritmus minden utasításához megadjuk az időköltséget és az ismétlések számát, ahol a feltétel-ellenőrzések száma a while [10]  belső ciklusban :

A kód Ár Visszajátszások
j = 2 esetén A.hossz
kulcs = A[j]
i = j - 1
miközben i > 0 és A[i] > gomb
A[i+1] = A[i]
i = i - 1
A[i+1] = kulcs

A beillesztési rendezési algoritmus futási ideje az egyes lépések futási idejének összege [11] : .

A legkedvezőbb eset a rendezett tömb. Sőt, minden belső ciklus csak egy iterációból áll, vagyis az összes . Ekkor az algoritmus futási ideje . A futási idő lineárisan függ a bemenő adatok méretétől [12] .

Legrosszabb eset elemzése

A legrosszabb eset egy fordított sorrendben rendezett tömb. Ebben az esetben minden új elem összehasonlításra kerül a rendezett sorrendben szereplő összes elemmel. Ez azt jelenti, hogy minden belső hurok j iterációból áll, azaz minden . Ekkor az algoritmus futási ideje a következő lesz:

.

A futási idő a bemeneti adatok méretének négyzetes függvénye [13] .

Átlagos esetelemzés

Az átlagos eset elemzéséhez ki kell számítania a következő elem helyzetének meghatározásához szükséges összehasonlítások átlagos számát. Új elem hozzáadásakor legalább egy összehasonlítás szükséges, még akkor is, ha az elem a megfelelő pozícióban van. A hozzáadandó elem az egyik pozíciót elfoglalhatja. Véletlenszerű bemeneteket feltételezve az új elem ugyanannyira valószínű, hogy bármely pozícióba kerül [14] . Az összehasonlítások átlagos száma a -edik elem beszúrásához [15] :

Az n elem átlagos futási idejének becsléséhez össze kell adni [16] :

Az algoritmus időbonyolultsága  . Az állandó tényezők és az alacsonyabb sorrendű feltételek miatt azonban egy magasabb növekedési sorrendű algoritmus gyorsabban futhat kis bemeneteken, mint egy alacsonyabb növekedési sorrendű algoritmus [17] .

Lásd még

Jegyzetek

  1. Knut D. E. 5.2 Belső rendezés // A programozás művészete. 3. kötet. Rendezés és keresés = The Art of Computer Programming. 3. kötet. Rendezés és keresés / szerk. V. T. Tertysnij (5. fejezet) és I. V. Krasikov (6. fejezet). - 2. kiadás - Moszkva: Williams, 2007. - T. 3. - 832 p. — ISBN 5-8459-0082-1 .
  2. Kormen, 2013 , p. 38.
  3. Kormen, 2013 , p. 39.
  4. Knut D. E. 5.2.1 Beszúrások szerinti rendezés // A programozás művészete. 3. kötet. Rendezés és keresés = The Art of Computer Programming. 3. kötet. Rendezés és keresés / szerk. V. T. Tertysnij (5. fejezet) és I. V. Krasikov (6. fejezet). - 2. kiadás - Moszkva: Williams, 2007. - T. 3. - 832 p. — ISBN 5-8459-0082-1 .
  5. 1 2 Cormen, 2013 , p. 39-40.
  6. N. Wirth. Algoritmusok és adatstruktúrák. - M. : DMK Press, 2010. - S. 74. - 272 p. - ISBN 987-5-94074-584-6.
  7. Skiena S. Algoritmusok. Fejlesztési útmutató. - 2. - Szentpétervár. : BHV-Petersburg, 2014. - S. 137. - 720 p. - ISBN 978-5-9775-0560-4 .
  8. 1 2 Aho, 2000 , p. 237.
  9. Kormen, 2013 , p. 47.
  10. Kormen, 2013 , p. 48.
  11. Kormen, 2013 , p. 48-49.
  12. Kormen, 2013 , p. 49.
  13. Kormen, 2013 , p. 49-50.
  14. McConnell, 2004 , p. 74.
  15. McConnell, 2004 , p. 75.
  16. McConnell, 2004 , p. 75-76.
  17. Kormen, 2013 , p. 51.

Irodalom

Linkek