Sunteți pe pagina 1din 9

Tehnici de sortare directă a tablourilor

2.2.1. Metode directe de sortare


Metodele care realizează sortarea sunt următoarele:
sortarea prin inserţie
sortarea prin selecţie
sortarea prin interschimbare
sortarea prin amestecare, shakersort

2.2.1.1. Tehnica sortării prin inserţie


Cele N elemente de sortat sunt în mod conceptual divizate într-o secvenţă
destinaţie a1 .... ai-1 şi respectiv într-o secvenţă sursă a i ... an. La fiecare pas,
începând cu i=2 şi incrementând pe i cu 1, cel de-al i-lea element al
secvenţei sursă ai este luat şi transferat în secvenţa destinaţie prin
inserarea sa la locul potrivit. Selectarea locului unde trebuie inserat
elementul se face parcurgând şirul a1 ..... ai-1 de la dreapta la stânga,
oprirea realizându-se pe primul element a j care are cheia mai mică sau
egală cu ai sau, dacă un astfel de element nu există, pe a 1.
Principiu:

 Se compară primul element cu toate elementele care urmează după


el;
 În momentul în care se găsește un element mai mic decât primul
acesta va veni pe prima poziție, elementul cu valoare mai mare
luându-i locul;
 Se va continua cu al doilea element al șirului, pe care, de asemenea îl
comparăm cu toate elementele care urmează după el.
void sortare_insertie() Se consideră tabloul de elemente:
{ A[ 1 2 3 4 5 6 7]
int i,j,x; 87 12 48 22 69 75 31
for (i=2;i<=n;i++)
{ i=2 12 87 48 22 69 75 31
x=a[i];
j=i-1; i=3 12 48 87 22 69 75 31
while (j>0 && a[j]>x)
{ i=4 12 22 48 87 69 75 31
a[j+1]=a[j];
j=j-1; i=5 12 22 48 69 87 75 31
}
a[j+1]=x; i=6 12 22 48 69 75 87 31
}
} i=7 12 22 31 48 69 75 87
2.2 Tehnica sortării prin selecţie

Acest algoritm foloseşte procedeul de a căuta elementul cu valoarea


minimă din cele N elemente de sortat, şi de a schimba între ele poziţiile
acestui element cu primul element. Se repetă apoi procedeul cu cele N-1
elemente rămase, apoi cu cele N-2, terminând cu ultimele 2 elemente.
void sortare_selectie() Se consideră tabloul de elemente:
{ A[ 0 1 2 3 4 5 6]
int i,j,k,x; 87 12 48 22 69 75 31
for (i=0;i<n-1;i++)
{ i=0 12 87 48 22 69 75 31
k=i;// pozitia minima i=1 12 22 48 87 69 75 31
x=a[i]; //retine minimul i=2 12 22 31 87 69 75 48
for (j=i+1;j<n;j++) i=3 12 22 31 48 69 75 87
if (a[j]<x)
{
x=a[j];
k=j;
}
a[k]=a[i];
a[i]=x;
}
}
2.3 Tehnica sortării prin interschimbare (bubble-sort)

Principiul acestei metode este următorul: se compară şi


se interschimbă perechile de elemente alăturate, parcurgând
tabloul de la stânga la dreapta, până când toate elementele
devin sortate. La fiecare trecere prin tablou se deplasează cel
mai mic element spre capătul din stânga al tabloului. Dacă
considerăm tabloul vertical şi vom asimila elementele sale
cu nişte bule de aer în interiorul unui lichid, fiecare bulă
având o “greutate” proporţională cu valoarea cheii, atunci
fiecare trecere prin tablou se soldează cu ascensiunea unei
bile la nivelul specific de greutate. Din acest motiv, această
metodă se mai numeşte şi sortare prin metoda bulelor
(bubble-sort).
while(!ok)
{ 87 12 48 22 69 75 31
ok=1;
for(i=0;i<n-1;i++){ i=0 12 87 48 22 69 75 31
if(a[i]>a[i+1]){ i=1 12 48 87 22 69 75 31
aux=a[i]; i=2 12 48 22 87 69 75 31
a[i]=a[i+1]; i=3 12 48 22 69 87 75 31
a[i+1]=aux; i=4 12 48 22 69 75 87 31
ok=0; i=5 12 48 22 69 75 31 87
}
} i=1 12 22 48 69 75 31 87
} i=4 12 22 48 69 31 75 87

i=3 12 22 48 31 69 75 87

i=2 12 22 31 48 69 75 87
Acestui algoritm i se pot aduce o serie de îmbunătăţiri şi
anume:
- se observă că ultimele treceri prin tablou sunt fără efect,
elementele fiind deja ordonate. Deci, se poate memora dacă a
avut loc o schimbare în ordonarea elementelor şi dacă nu,
algoritmul nu se mai continuă. Și în acest caz însă este
necesară o ultimă trecere fără modificări.
- la o analiză atentă se poate observa o asimetrie particulară:
astfel un singur element "uşor" plasat la capătul "greu" este
readus la locul său într-o singură trecere, pe când un element
"greu" plasat la capătul "uşor" va fi readus pe locul său doar cu
câte o poziţie la fiecare trecere. Această asimetrie sugerează ca
îmbunătăţire alternarea sensurilor de parcurgere ale trecerilor
consecutive. Algoritmul care conţine aceste îmbunătăţiri se
numeşte shakersort sau sortare prin amestecare.
void shakersort() Se consideră tabloul de elemente:
{ A[ 1 2 3 4 5 6 7]
int j,k,l,r,x; 87 12 48 22 69 75 31
l=2;r=n;k=n;
do l=2, r=7, k=7
{
for (j=r;j>=l;j--) j=7 87 12 48 22 69 31 75
j=6 87 12 48 22 31 69 75
if (a[j-1]>a[j]) j=5-
{ j=4 87 12 22 48 31 69 75
x=a[j-1];a[j-1]=a[j];a[j]=x; j=3 –
k=j; j=1 12 87 22 48 31 69 75, k=2, l=2+1=3.
}
l=k+1;
for (j=l;j<=r;j++) j=3 12 22 87 48 31 69 75
if (a[j-1]>a[j]) j=4 12 22 48 87 31 69 75
j=5 12 22 48 31 87 69 75
{
j=6 12 22 48 31 69 87 75
x=a[j-1];a[j-1]=a[j];a[j]=x; j=7 12 22 48 31 69 75 87, r=k-1=6
k=j; while(3<=6)
} Se reia primul for , j=r=6
r=k-1; j=6, j=5 nici o modificare
} while (l<=r);} j=4 12 22 31 48 69 75 87