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 - .
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] .
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 .
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] .
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] .
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] .
Rendezési algoritmusok | |
---|---|
Elmélet | Bonyolultság O jelölés Rendelési viszony Típusok rendezése fenntartható Belső Külső |
Csere | |
Választás | |
Betétek | |
egyesülés | |
Nincs összehasonlítás | |
hibrid | |
Egyéb | |
nem praktikus |