name = 'quick_sort/2' slug = 'Uredi seznam z algoritmom quicksort' description = '''\

quick_sort(L, SL): seznam SL vsebuje elemente iz L urejene v naraščajočem vrstnem redu. Uporabi predikat pivoting/4 za implementacijo algoritma quicksort.

?- quick_sort([2,3,1,5,4], L).
  L = [1,2,3,4,5].
''' plan = ['''\

Deli in vladaj! In uporabi prejšnje rešitve, seveda :)

''', '''\

Vzami glavo stran, uporabi jo za pivot, razdeli rep na manjše in večje elemente. Na dobljenih seznamih uporabi rekurzijo saj sta manjša (v najslabšem primeru samo za glavo krajša -- tukaj tudi lepo vidiš, zakaj je quicksort slab ravno pri že urejenih seznamih). Na koncu vse skupaj preprosto združi!

''', '''\

Če je seznam L sestavljen iz glave P in repa T in če rep razdelimo na seznam manjših in seznam večjih elementov glede na pivot P ter predpostavimo, da ta seznama pravilno uredi rekurzija v seznama SortedSmallerElems in SortedGreaterElems ter potem ta seznama preprosto staknemo enega za drugim in med njiju dodamo pivot/glavo P, potem dobimo pravilno urejen začetni seznam L.

'''] hint = { 'eq_instead_of_equ': '''\

Operator == je strožji od operatorja = v smislu, da je za slednjega dovolj, da elementa lahko naredi enaka (unifikacija).

Seveda pa lahko nalogo rešiš brez obeh omenjenih operatorjev, spomni se, da lahko unifikacijo narediš implicitno že kar v argumentih predikata (glavi stavka).

''', 'eq_instead_of_equ_markup': '''\

Morda bi bil bolj primeren operator za unifikacijo (=)?

''', 'base_case': '''\

Si pomislil na robni pogoj? Kateri seznam lahko urediš povsem brez dela?

''', 'recursive_case': '''\

Robni primer deluje. Kaj pa rekurzivni, splošni, primer?

''', 'predicate_always_false': '''\

Vse kaže, da tvoj predikat vedno vrne "false". Si mu dal pravilno ime, si se morda pri imenu zatipkal?

Če je ime pravilno, se morda splača preveriti tudi, če se nisi zatipkal kje drugje, je morda kakšna pika namesto vejice ali obratno, morda kakšna spremenljivka z malo začetnico?

Možno je seveda tudi, da so tvoji pogoji prestrogi ali celo nemogoči (kot bi bila npr. zahteva, da je X hkrati večji in manjši od Y ali kaj podobno logično sumljivega).

''', 'timeout': '''\

Je morda na delu potencialno neskončna rekurzija? Kako se bo ustavila?

Morda pa je kriv tudi manjkajoč, neustrezen ali preprosto nekompatibilen (s splošnim primerom) robni pogoj?

''', 'arbitrary_base_case': '''\

Kako je lahko urejen prazen seznam karkoli ali seznam s poljubnim elementom (spremenljivka brez vrednosti)?

''', 'forgotten_pivot': '''\

Si morda pozabil glavo, ki si jo uporabil za pivot, ob vračanju dati nazaj?

''', }