(a) Dopolni funkcijo UrejanjeZVstavljanjem
na prejšnji strani tako, da na koncu vsake iteracije glavne zanke izpiše tabelo a
in pri tem z navpično črto loči urejeni del od neurejenega, podobno kot v našem primeru.
(b) Preizkusi funkcijo na nekaj konkretnih primerih vhodne tabele a
.
(c) Izmeri čas izvajanja prvotne funkcije (brez izpisovanja tabele) na različno dolgih tabelah (do nekaj 100 elementov). Oceni njeno časovno zahtevnost.
(d) Kako na čas izvajanja vpliva začetno stanje tabele a
? Preizkusi funkcijo na nekaj tabelah, ki so vse enako dolge in vsebujejo enake elemente, vendar v različnih vrstnih redih (na primer: tabela, ki je že urejena naraščajoče; tabela, ki je urejena padajoče; naključno premešana tabela; ipd.).
Kakšna je časovna zahtevnost tega postopka? Spet imamo dve gnezdeni zanki; zunanja (po k) naredi približno n iteracij, notranja (po i) pa se pri vsakem k začne z i = k in se konča najpozneje tedaj, ko i pade na 0, torej naredi največ k iteracij, to pa je manj kot n. Skupno število iteracij notranje zanke je torej največ n ⋅ n = n2. Pri vsaki iteraciji notranje zanke moramo izvesti eno primerjavo (a[i - 1] > t
, s katero preverimo, če smo že dosegli elemente, manjše od tistega, ki ga vstavljamo) in eno prireditev (da premaknemo element a[i - 1]
eno mesto naprej po tabeli). Časovna zahtevnost tega postopka je torej O(n2) primerjav in prirejanj elementov.
Tu lahko opazimo nekaj zanimivih razlik v primerjavi z urejanjem z izbiranjem. Tam smo imeli za vsak element le eno zamenjavo, tu pa imamo lahko precej več dela s premikanjem elementov po tabeli. Po drugi strani pa smo morali pri izbiranju vedno izvesti največje možno število primerjav, ne glede na to, kakšno tabelo smo dobili. Pri urejanju z vstavljanjem pa je število primerjav (in prireditev) zelo odvisno od tega, kako daleč nazaj po tabeli je treba vstavljati elemente. Če dobimo tabelo, ki je že skoraj urejena, bomo imeli z vstavljanjem malo dela; če dobimo že urejeno tabelo, bo notranja zanka pri vsakem k ugotovila, da vstavljanje sploh ni potrebno, zato bo časovna zahtevnost postopka takrat le O(n).
Vidimo torej, da na vprašanje o tem, ali je boljše urejanje z izbiranjem ali urejanje z vstavljanjem, ni enostavnega odgovora – to, kateri postopek je boljši, je odvisno od tega, s kakšnimi podatki bomo imeli opravka (kako neurejena je naša tabela na začetku izvajanja), in od tega, koliko časa traja primerjanje dveh elementov, koliko časa pa prirejanje.
(a) Dopolni tu prikazani implementaciji urejanja z izbiranjem in urejanja z vstavljanjem tako, da bosta prešteli (oz. na koncu izpisali), koliko primerjav med dvema elementoma tabele sta izvedli in koliko prireditev, v katerih so udeleženi elementi tabele (torej prireditev oblike a[x] = a[y]
, t = a[y]
ali a[x] = t
).
(b) Preizkusi obe različici urejanja na več vhodnih tabelah različnih dolžin in primerjaj njun čas izvajanja ter število izvedenih primerjav in prireditev. Med vhodnimi tabelami naj bodo tudi take, ki so že urejene naraščajoče; take, ki so urejene padajoče; in take, ki so bolj ali manj naključno premešane.