Sunteți pe pagina 1din 5

Laborator 9

Aplicatii Divide et Impera Mergesort Quicksort

Mergesort Acest algoritm de sortare implementeaza tehnica divide et impera. Pasul de divide se face prin impartirea sirului curent in doua subsiruri care urmeaza a fi sortate in urma procesului recursiv. Sirurile ordonate sunt apoi interclasate (impera . Interclasarea a doua siruri ordonate este un proces prin care se construieste un al treilea sir sortat cu elementele celor doua siruri initiale. Interclasarea a doua siruri de numere ordonate crescator presupune parcurgerea simultana a celor doua si compararea elementelor curente! cel mai mic din cele doua se copiaza intr"un al treilea sir la sfarsit si se elimina din sirul initial (in practica nu este obligatoriu sa fie eliminat# urmatorul devine curent . $and elementele unui sir au fost epuizate# elementele ramase in celalalt sunt copiate in noul sirul la sfarsit. %&emplu de interclasare a doua siruri ordonate' a' (# (# )# (*# *+# ), b' -# *# )# (+# (,# -+# -,# -. c' Se compara primul element din a(( cu primul din b(- si cel mai mic(( se adauga la c' a' (# )# (*# *+# ), b' -# *# )# (+# (,# -+# -,# -. c' ( Se continua algoritmul si se obtin succesiv sirurile' a' )# (*# *+# ), b' -# *# )# (+# (,# -+# -,# -. c' (# ( a' )# (*# *+# ), b' *# )# (+# (,# -+# -,# -. c' (# (# -

a' )# (*# *+# ), b' )# (+# (,# -+# -,# -. c' (# (# -# * a' (*# *+# ), b' )# (+# (,# -+# -,# -. c' (# (# -# *# ) ... a' *+# ), b' c' (# (# -# *# )# )# (+# (*# (,# -+# -,# -. In acest moment elementele ramase in a sunt copiate la sfarsitul lui c' c' (# (# -# *# )# )# (+# (*# (,# -+# -,# -.# *+# ),

%&emplificarea algoritmului de mergesort pentru sirul (+# )# -# /# (# 0# (*'

Pseudocod' mergesort(real v[p..u]) if (p<u) m [(p+u)/2] mergesort(v, p, m) mergesort(v, m+1, u) interclasare (v, p, u) endif

Sirurile v1p2# v1p3(2# 4 v1m2 respectiv v1m3(2# v1m3-2# 4 v1u2 sunt sortate (in urma apelurilor recursive si li se poate aplica algoritmul de interclasare. 5unctia interclasare construieste un al treilea sir in vectorul a# iar sirul astfel obtinut este copiat in final inapoi in vectorul v intre pozitile p si u. interclasare(real v[p..u]) m [(p+u)/2] ip j m+1 ! "#ile (i<$m and j<$ u) do +1 if (v[i]<$v[j]) a[ ] v[i] i i+1 else a[ ] v[j] j j+1 endif end"#ile "#ile (i<$m) do +1 a[ ] v[i] i i+1 end"#ile "#ile (j<$u) do +1 a[ ] v[j]

j j+1 end"#ile for i 1, do v[i+p%1] a[i] endfor

Quicksort Ideea algoritmului de Quicksort este ca in sirul curent sa se aleaga un element pivot care sa se aseze pe pozitia finala in vectorul sortat astfel incat toate elementele mai mici sa se gaseasca in stanga lui si toate mai mari in dreapt Ideea algoritmului de Quicksort este ca la fiecare pas sirul curent sa se imparta in doua subsiruri astfel incat elementele din primul subsir sa fie mai mici decat elementele din cel de"al doilea. Acest lucru se realizeaza alegand un element pivot# pozitionandu"l pe acesta pe pozitia finala in sirul initial sortat si mutand toate elementele mai mici ca el in stanga si cele mai mari in dreapta. Algoritmul se aplica recursiv pe cele doua subsiruri. 6 posibilitate de alegere a pivotului o reprezinta alegerea primului element din sir. In continuare se parcurge sirul simultan de la stanga la dreapta incepand cu pozitia a doua si de la dreapta la stanga(cu prioritate pana la 7intalnire8. %lementele mai mici decat pivotul aflate la stanga se vor interschimba cu cele mai mari aflate la dreapta. In final se interschimba valoarea pivotului cu valoarea pe care s"a oprit parcurgerea. %&emplificarea pivotarii pentru sirul )/# 0(# /,# ,# .,# (# -*. Pivotul este )/ si se incepe parcurgerea simultana' )/# 91# /,# ,# .,# (# 23 $um 0(9)/ si -*:)/ se interschimba valorile acestora si se continua parcurgerea' )/# -*# 75# ,# .,# 1# 0( Are loc o noua interschimbare' )/# -*# (# 5# 65# /,# 0( Se continua parcurgerea' )/# -*# (# 5# .,# /,# 0( In acest moment cele doua parcurgeri s"au intalnit si se face interschimbarea ,# -*# (# 47# .,# /,# 0( Pivotul este asezat pe pozitia finala in sir si toate elementele din stanga sunt mai mici# toate din dreapta mai mari. Se continua acelasi algoritm in sirurile ,# -*# ( respectiv .,# /,# 0(.

Pseudocod' &uic sort(real v[p..u]) if (p<u) po' pivotare(v, p, u) &uic sort(v, p, po'%1) &uic sort(v, po'+1, u) endif pivotare(real v[p..u]) pivot v[p]( s p+1 du "#ile (s<$d) do "#ile (v[d])pivot) do d d%1 end"#ile "#ile(v[s]<$pivot and s<$d) do s s+1 end"#ile if (s<$d) v[s] * v[d] s s+1 d d%1 endif end"#ile v[p] * v[d] return d

S-ar putea să vă placă și