Sunteți pe pagina 1din 2

Profesor Darie Simona

Sortare prin numărare

Metoda 1 – se aplică numai pentru vector alcătuit din valori distincte

PRINCIPIU:
- Se copiază vectorul x într-un vector ajutător, de ex. y
- Pentru orice y[i] , se determină câte elemente din vector sunt mai mici decât el ➔ k
- Se reconstruiește vectorul x, plasând y[i] în x, pe poziția k+1

Ex. ne propunem ordonare crescătoare

x= 17 13 14 5 7 25 10

1 2 3 4 5 6 7

y= 17 13 14 5 7 25 10

Pentru y[1], numărul valorilor mai mici decât y[1] (17) este 5 ➔ x[5+1]=y[1]

x= 17 13 14 5 7 17 10

1 2 3 4 5 6 7

Pentru y[2], numărul valorilor mai mici decât y[2] (13) este 3 ➔ x[3+1]=y[2]

x= 17 13 14 13 7 17 10

1 2 3 4 5 6 7

Pentru y[3], numărul valorilor mai mici decât y[3] (14) este 4 ➔ x[4+1]=y[3]

x= 17 13 14 13 14 17 10

1 2 3 4 5 6 7

Pentru y[4], numărul valorilor mai mici decât y[4] (5) este 0 ➔ x[0+1]=y[4]

x= 5 13 14 13 14 17 10

1 2 3 4 5 6 7

Pentru y[5], numărul valorilor mai mici decât y[5] (7) este 1 ➔ x[1+1]=y[5]

x= 5 7 14 13 14 17 10

1 2 3 4 5 6 7

Pentru y[6], numărul valorilor mai mici decât y[6] (25) este 6 ➔ x[6+1]=y[6]

x= 5 7 14 13 14 17 25

1 2 3 4 5 6 7

Pentru y[7], numărul valorilor mai mici decât y[7] (10) este 2 ➔ x[2+1]=y[7]

x= 5 7 10 13 14 17 25

Pagină 1 din 2
Profesor Darie Simona
Implementări C++
Varianta 1 - cu 1 vector ajutător
for(i=1;i<=n;i++) y[i]=x[i];
for(i=1;i<=n;i++) {
k=0;
for(j=1; j<=n; j++)
if (y[j] < y[i]) k++;
x[k+1]=y[i]; // reconstruire vector x
}

Varianta 2 - cu 2 vectori ajutători


for(i=1;i<=n;i++) { y[i]=x[i]; k[i]=0; }
for(i=1;i<=n-1;i++)
for(j=i+1; j<=n; j++)
if (y[j] < y[i]) k[i]++;
else k[j]++;
// reconstruire vector x
for(i=1;i<=n;i++) x[ k[i]+1 ]=y[i];

Metoda 2 – se aplică numai pentru vector alcătuit din valori ce pot deveni poziții ale altui vector

PRINCIPIU:
- Se folosește un vector caracteristic pentru mulțimea valorilor din vectorul x, de ex. v
- Pentru orice x[i] , v[x[i]] se incrementează
- Se reconstruiește vectorul x, pe baza vectorului v

Ex. ne propunem ordonare crescătoare, pentru vectorul x ce conține numere naturale cu maxim 2 cifre
➔ mulțimea valorilor din vectorul x este {0,1,2,...,99}. Aceste valori pot deveni poziții în vectorul v în care, v[i]
semnifică numărul de apariții ale valorii i în vectorul x.
x= 4 1 4 1 4 2 3

1 2 3 4 5 6 7

v= 0 2 1 1 3 0 0

0 1 2 3 4 ..... 99

x= 1 1 2 3 4 4 4

1 2 3 4 5 6 7

Implementare C++
for(i=1;i<=n;i++) v[i]=0;
for(i=1;i<=n;i++) v[ x[i] ]++;
n=0;
for(i=0;i<100;i++)
while (v[i]>0) x[++n]=i, v[i]--;

Pagină 2 din 2

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