|
OBS. Nu uita, in Python elementele unei liste sunt numerotate de la 0 la n-1, unde n reprezinta numarul de elemente din lista.
|
Dupa cum poti observa, in acest exemplu procedura Insert este reprezentata de fapt de cel de-al doilea ciclu while (while j >= 0 and B[j] > val). In rest, ea functioneaza dupa cum am descris mai sus.
Sortarea prin interclasare
Sortarea prin interclasare sau merge-sort este un algoritm recursiv de tipul divide-et-impera, cu un timp de executie O(n log n). Functionarea acestui algoritm poate fi descrisa astfel:
1. Daca lista este de lungime 0 sau 1, atunci este deja sortata. Altfel:
2. Imparte lista nesortata in doua liste de lungimi egale (stanga si dreapta).
3. Sorteaza cele doua sub-liste recursiv prin aplicarea aceluiasi algoritm de sortare.
4. Uneste cele doua sub-liste intr-una singura prin apelarea unei proceduri.
Sa presupunem ca avem un vector C cu n elemente de la C[0] la C[n-1]. Vom calcula mijlocul acestui vector ca m = n /2, apoi il vom imparti in doua liste: (C[0],C[1], ..., C[m-1]) si (C[m],C[m+1],...,C[n-1]) si vom apela procedura de sortare pentru fiecare sub-lista in parte. Dupa cele doua jumatati au fost ordonate, ele vor fi unite pentru a forma un singur vector.
 |
Ordonarea unei multimi de elemente prin interclasare Sursa: wikipedia.org |
Iata cum arata acest algoritm in Python:
def interclasare(C):
if len(C) <= 1:
return C
rezultat = []
stanga = []
dreapta = []
mijloc = len(C) / 2
i = 0
while i < mijloc:
stanga.append(C[i])
i = i + 1
while i < len(C):
dreapta.append(C[i])
i = i + 1
stanga = interclasare(stanga)
dreapta = interclasare(dreapta)
if stanga[len(stanga) - 1] > dreapta[0]:
rezultat = uneste(stanga,dreapta)
else:
for item in stanga:
rezultat.append(item)
for item in dreapta:
rezultat.append(item)
return rezultat
vector = [38,27,43,3,9,82,10]
print "Vectorul initial:"
print vector
print "Vectorul sortat:"
print interclasare(vector)
Functia uneste este apelata doar daca in sub-vectorul stanga exista elemente mai mari decat in dreapta. Ea arata astfel:
def uneste(stanga,dreapta):
rezultat = []
while len(stanga) > 0 and len(dreapta) > 0:
if stanga[0] <= dreapta[0]:
rezultat.append(stanga[0])
del stanga[0]
else:
rezultat.append(dreapta[0])
del dreapta[0]
if len(stanga) > 0:
i = 0
while i < len(stanga):
rezultat.append(stanga[i])
i = i + 1
else:
i = 0
while i < len(dreapta):
rezultat.append(dreapta[i])
i = i + 1
return rezultat
Dupa cum poti observa, desi necesita doua functii, algoritmul este destul de usor de inteles. Pentru a face lucrurile si mai clare, iata cum va fi sortat un vector cu 7 elemente:
 |
Sortarea prin interclasare a unei liste de 7 numere intregi Sursa: wikipedia.org |
Sper ca acesti algoritmi sa-ti fie de folos pentru programele tale in Python. Nu uita, ei pot fi modificati pentru a lucra cu liste de obiecte, in functie de scopul programului tau.
Daca ai intrebari, nu ezita sa lasi un comentariu sau sa-mi trimiti un mesaj. Spor la lucru!
|