Algoritem za navadno zlivanje

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje

Podatke porazdeljujemo po trakovih tako, da na vsak trak, s katerega bomo potem zlivali, damo po en element. Dobimo več trakov, s katerih zlivamo nazaj na začetnega.

                3|1|8|5                 3,7|4,8                 1,2,3,7
               /       \               /       \               /       \
3|7|1|2|8|4|5|6         3,7|1,2|4,8|5,6         1,2,3,7|4,5,6,8         1,2,3,4,5,6,7,8
               \       /               \       /               \       /
                7|2|4|6                 1,2|5,6                 4,5,6,8


To je 2-smerno navadno zlivanje, trakov je 2 + 1.
Casovna zahtevnost je Θ(2N log2N) oz. Θ(N log N)

  1. Neurejeno zaporedje dolžine n razvrstimo na trakove tako, da na vsakega izmenično zapišemo število z vhodnega traku. POZOR! Zaporedja na vhodnem traku ne moramo razdeliti na pol in prvo polovico prepisati na prvi in drugo polovico na drugi trak, ker naceloma (in to vedno velja na izpitu) ne poznamo dolzine zaporedja in tako ne vemo kje je tista polovica traku (iskanje polovice pa tudi ne pride v postev).
  2. Nato vzamemo prvi element iz vsakega traku, in jih uredimo, ter jih zapišemo na prazen trak (to je kar vhodni trak). <-- faza zlivanja
  3. Zdaj imamo na traku urejena zaporedja dolžine 2. Tako zdaj zapišemo na vsak trak po 2 zaporedna elementa (ki sta ze urejena).
  4. Spet zlivamo tako, da posortiramo 2 zaporedji dolžine 2.
  5. Postopek ponavljamo, dokler ne dobimo urejenega zaporedje dolžine n.



Časovna zahtevnost je 4n(log(st dodatnih trakov brez vhodnega) n; kjer je n število elementov.

Lahko pospešimo na 2n s tem da opustimo eno pisanje.

Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja