Professional Documents
Culture Documents
Metode de sortare
1. Concepte generale
o Sortarea datelor este un pas important care trebuie să fie realizat înainte de aplicarea
altor algoritmi ca, de exemplu, a algoritmului de căutare.
o Mulţi cercetători în informatică au petrecut mult timp dezvoltând diverse metode de
sortare, deoarece aceşti algoritmi importanți în orice implementare, dar sunt și foarte
mari consumatori de timp.
Exemple de sortări:
Sortare prin inserţie,
Sortare prin selecţie,
Sortare Bubble
Sortare rapidă (quicksort)
Sortare shell
Să considerăm șirul:
S = {s1, s2, …, sn}
Format din elemente aparținând universului U. Scopul sortării este de a rearanja elementele
din S astfel încât să formăm un șir nou S’ în care elementele sunt în ordine.
Încercăm să formăm o serie de șiruri sortate S’0, S’1, S’2, …,S’n, astfel:
1. Primul șir sortat este mulțimea vidă S’0 : S’0 = {}.
2. Având șirul S’i în seria de șiruri sortate, următorul șir în serie este S’i+1, obținut prin
inserarea elementului (i+1) al șirului nesortat si+1 în poziția corectă în șirul S’i.
La fiecare pas, se face o căutare liniară a elementelor nesortate pentru a se determina poziția
celui mai mare element rămas. Acest element este apoi mutat în poziția corectă a șirului prin
inversarea lui cu elementul ce ocupă respectiva poziție. Totodată există și varianta de căutare
a elementului minim ce se mută în poziția corespunzătoare:
Exemplu:
Complexitate: O(n2)
4. Sortarea bubble
Pentru a sorta șirul S = {s0, s1, …, sn-1}, sortarea bubble face n-1 treceri pin șirul de date.
La fiecare pas de trecere, elementele adiacente (alăturate) sunt comparate și inversate
dacă este cazul. Întâi sunt comparate s0 și s1 ,apoi s1 și s2 etc.
După prima trecere prin șirul de date, cel mai mare element este practic împins pin
șir, până în ultima poziție a acestuia.
În general, după k treceri prin șirul de date, ultimele k elemente ale șirului sunt
ordonate și pot fi ignorate la pașii următori.
Exemplu:
Complexitate: O(n2)
Pentru a sorta șirul S = {s1, s2, …, sn}, se selectează unul dintre elementele lui S, care
se va numi pivot și se va nota cu p . Elementele rămase din S se vor muta astfel încât se
formează două subșiruri L și G.
• L conține elementele mai mici decât p
• G conține elementele mai mari decât p
L și G sunt subșiruri nesortate.
Recursiv, aplicăm aceeași metodă pe subșirurile L și G.
Algoritm:
1. Alege pivot.
2. Parcurge șirul S de la stânga la dreapta până când este găsit un element
s[i] >=p
3. Parcurge șirul S de la dreapta la stânga până când este găsit un element
s[j] <=p
4. Inversează elementele s[i] și s[j] dacă i<=j.
5. Se repetă pașii 2, 3, 4 până când i>j.
În acest moment șirul este împărțit în două subșiruri.
Se repetă pașii pentru fiecare subșir.
Împărțirea în subșiruri se continuă până când șirul este complet sortat!!!
Complexitatea:
Exemplu:
9 5 8 7 3 12 10
i -> <- j
3 5 7 8 9 12 10
3 5 7 8 9 12 10
6. Sortarea shell
Algoritmul se bazează pe sortarea prin inserție dar are o performanță mai bună.
A fost inventat de Donald Shell în 1959.
Complexitatea este: O(n(log n)2).
Sortarea se face prin compararea elementelor aflate la o anumită distanță una de
cealaltă. Dacă nu sunt în ordine, ele se inversează. Numărul de poziții dintre ele
trebuie să scadă după fiecare parcurgere a șirului.
Spațiul dintre elemente se numește distanță și, în general, se alege ca fiind jumătatea
numărului de elemente din șirul ce trebuie sortat.
Exemplu:
Metode de căutare
După aplicarea unei metode de sortare, șirul de elemente este ordonat și se poate efectua mult
mai ușor căutarea unui anumit element.
Tipuri de căutări:
a. Căutare liniară
b. Căutare binară
a. Căutarea liniară se execută în aceeași manieră ca în cazul căutării într-un șir nesortat.
Diferența este că, de data aceasta, șirul fiind sortat, căutarea se oprește atunci când este găsit
un element cu o valoare mai mare decât a elementului căutat.
while(true)
{
current = (lowerLimit + upperLimit ) / 2;
if(happy[current]==Key) // happy este denumirea șirului în care caut
return current; // l-am găsit!
else if(lowerLimit > upperLimit)
return -1; // nu pot să-l găsesc
else // împart șirul
{
if(happy[current] < Key)
lowerLimit = current + 1; // elementul este în jumătatea superioară
else
upperLimit = current - 1; // elementul este în jumătatea inferioară
}
}
} // end find()
Observații!!!
Dacă nu primiți o confirmare din partea mea în 24 de ore, trimiteți fișierul din nou.
Tema valorează 1 punct din nota finală (după cum s-a anunțat la începutul
semestrului).