3
Napiši funkcijo Razdeli(a, m)
, ki dobi tabelo a
in vrednost m
ter elemente tabele a
prerazporedi tako, da se uvrstijo na začetek vsi elementi, ki so manjši od m
, nato vsi elementi, ki so enaki m
, in nazadnje vsi elementi, ki so večji od m
. Funkcija naj vrne število elementov, ki so manjši od m
, in število elementov, ki so večji od m
.
Primer: če imamo a = [5, 8, 7, 9, 2, 3]
, mora klic Razdeli(a, 7)
vrniti [3, 1]
(ker so v tabeli trije elementi, manjši od 7, in en element, večji od 7); za končno stanje tabele a
pa je več možnosti, na primer [3, 2, 5, 7, 9, 8]
ali [5, 2, 3, 7, 8, 9]
in podobno. Končno stanje tabele torej pri tej nalogi ni enolično določeno, pomembno je le, da se uvrstijo na začetek tabele elementi, ki so manjši od m
, na konec pa elementi, ki so večji od m
(vmes pa so tisti, ki so enaki m
).
4
(a) Napiši funkcijo HitroUrejanje(a)
, ki uredi tabelo a
po naslednjem postopku. Za m
si izberimo poljubni element tabele in s funkcijo Razdeli
iz prejšnje naloge razdelimo tabelo a
na tri dele; v prvem delu so vsi elementi manjši od m
, v drugem vsi enaki m
in v tretjem vsi večji od m
. Če zdaj uredimo prvi del posebej in tretji del posebej, bodo vsi trije deli skupaj tvorili urejeno različico celotne tabele. Za urejanje prvega in tretjega dela uporabimo enak postopek (rekurzivno kličemo funkcijo HitroUrejanje
). Pazimo seveda tudi na to, da če je kateri od delov dolg manj kot 2 elementa, ga ni treba urejati, saj je tak že urejen.
(b) Preizkusi to funkcijo na nekaj različno dolgih tabelah a
in primerjaj njeno časovno zahtevnost z zahtevnostjo drugih postopkov za urejanje, ki smo jih spoznali v tej učni enoti.