Sunteți pe pagina 1din 15

Prezentare PowerPoint

Clasificare

 Metodele de sortare se clasifica in:


○ Metode directe
○ Metode avansate
 Metodele directe se bazeaza pe algoritmi de dificultate redusa,
usor de gasit si de inteles. Metodele directe pe care le vom
lua in considerare:
○ Sortarea prin selectie (SelectSort)
○ Sortarea prin insertie (InsertSort)
○ Sortarea cu bule (BubbleSort)
 Metodele avansate se bazeaza pe algoritmi putin mai
complicati dar, care nu necesita cunostinte avansate de
algoritmica. Cateva din cele mai cunoscute sunt:
o Sortarea rapida (QuickSort)
o Sortarea prin interclasare (MergeSort)
o Sortarea cu micsorarea incrementului (ShellSort)
Sortarea prin selectie (SelectSort)

Sortarea prin selectia minimului (sau maximului) este metoda de


ordonare prin selectarea unui element si plasarea lui pe pozitia
sa finala direct in tabloul A.
Exemplu:
Fie tabloul A=(5,0,8,7,3)
Elementul Pozitia Noul
Pasul Tabloul A
minim minimului tablou A
i=1 (5,0,8,7,3) 0 2 (0,5,8,7,3)

i=2 (0,5,8,7,3) 3 5 (0,3,8,7,5)

i=3 (0,3,8,7,5) 5 5 (0,3,5,7,8)

i=4 (0,3,5,7,8) 7 4
Codul in C++ al algoritmului de sortare
prin selectie
Int main()
{
int n,a[100],i,j,k,max,min;
cin>>n;
for(i=0;i<n;i++) se citesc datele de intrare
{
cout<<“a[“<<i<<“]=“; cin>>a[i];
}
for(i=0;i<n;i++)
{
min=a[i];
k=i;
for(j=i+1;j<n;j++)
if(a[j]<min)
{ se sorteaza vectorul
min=a[j];
k=j;
}
max=a[j];
a[k]=a[i];
a[i]=max;
}
for(i=0;i<n;i++)
cout<<a[i]<<“ “; se afiseaza rezultatele
}
Sortarea prin insertie (InsertSort)

Aceasta metoda aseaza elementul citit pe pozitia lui finala in


vector, comparandul cu valorile introduse deja si
interschimbandul pana ajunge in pozitia corecta.
Exemplu:
a1 a2 a3 a4 a5 a6
5 2 4 6 1 3
2 5 4 6 1 3
2 4 5 6 1 3
2 4 5 6 1 3
1 2 4 5 6 3
1 2 3 4 5 6
Codul in C++ al algoritmului de sortare
prin insertie
int main()
{
int v[100],j,n,i,aux;
cin>>n; se citesc datele de intrare
cin>>v[1];
for(i=2;i<=n;i++)
{
cout<<v”[“<<i<<“]=“; cin>>v[i];
j=i;
while(v[j]<v[j-1]&&j>1)
{ se sorteaza vectorul
aux=v[j];
v[j]=v[j-1];
v[j-1]=aux;
j--;
}
}
for(i=1;i<=n;i++)
cout<<v[i]<<“ “; se afiseaza rezultatele
}
Metoda bulelor (BubbleSort)

Aceasta metoda se rezuma la a compara fiecare element cu


celelalte, facandu-se interschimbarea daca elementul mai mare
are indexul mai mix. Este cea mai simpla metoda de sortare
si nu necesita cunoasterea detaliata a limbajului de programare.
Poate fi folosita cu succes de catre incepatori.
Exemplu:
Consideram tabloul A cu 5 elemente numere reale:0.0,1,1,1.2 si 0.08
I. Prima parcurgere a tabloului (ok este initializat cu adevarat)
a1=0.0 a2=1.1 a3=1.0 a4=1.2 a5=0.08 ok
0.0 1.0 1.1 1.2 0.08 fals
0.0 1.0 1.1 0.08 1.2 fals
Valorile 0.0 <1.1 raman neschimbate, 1.1>1.0 le interschimbam.Deoarece 1.1<1.2,avansam
si constatam ca 1.2>0.08,deci din nou avem interschimbare.In consecinta,la iesire din
structura pentru ok este fals.Observam ca 1.2 a ajuns pe locul lui definitiv(elementul maxim)
II. Urmeaza a doua parcurgere a tabloului (ok primeste din nou valoarea
adevarat)
a1=0.0 a2=1.0 a3=1.1 a4=0.08 a5=1.2 ok

0.0 1.0 0.08 1.1 1.2 fals

Am avut interschimbare si de data aceasta,deci iesim cu ok=fals.La acest pas 1.1 a ajuns
pe locul sau definitiv.
III. A treia parcurgere a tabloului incepe cu reinitializarea lui ok cu valoarea adevarat.
a1=0.0 a2=0.08 a3=1.0 a4=1.1 a5=1.2 ok

0.0 0.08 1.0 1.1 1.2 fals


Am interschimbat 0.08 cu 1.0,cel din urma astfel a ajuns pe locul sau in sirul ordonat.
IV. A patra parcurgere a tabloului se finalizeaza cu valoarea ok-adevarat,deoarece nu
am efectuat nici o interchimbare,ceea ce inseamna ca procesul de ordonare s-a inceiat.
a1=0.0 a2=0.08 a3=1.0 a4=1.1 a5=1.2 ok

0.0 0.08 1.0 1.1 1.2 adevarat


Codul in C++ al algoritmului de sortare
prin metoda bulelor
int main()
{
int v[100],i,n,gasit,aux;
cin>>n;
for(i=1i<=n;i++)
{ se citesc datele de intrare
cout<<“v[“<<i<<“]=“; cin>>v[i];
}
do
{
gasit=0;
for(i=1;i<=n;i++)
if(v[i]>v[i+1])
{
aux=v[i]; se sorteaza vectorul
v[i]=v[i+1];
v[i+1]=aux;
gasit=1;
}
}
while(gasit==1);
for(i=1;i<=n;i++)
cout<<v[i]<<“ “; se afiseza rezultatele
}
Sortarea rapida (QuickSort)

In practica algoritmul de sortare cel mai rapid este QuickSort numita sortare rapida,care
foloseste partitionarea ca idee de baza.
Metoda QuickSort presupune gasirea pozitiei finale pe care o ocupa elementul de pe prima
pozitie comparandu-l cu elementele din cealalta partitie a tabelului,acest,acest algoritm
realizandu-se pana cand partitia are 1 element.
Exemplu:
Vectorul A cu elementele 1,12,5,26,7,14,3,7,2
1 12 5 26 7 14 3 7 2

1 12 5 26 7 14 3 7 2

1 12 5 26 7 14 3 7 2

1 2 5 26 7 14 3 7 12

1 2 5 7 7 14 3 26 12

1 2 5 7 3 14 7 26 12

1 2 5 7 3 14 7 26 12

1 2 3 5 7 7 12 14 26
Codul in C++ al algoritmului de sortare
rapida (QuickSort)
int v[100],n,k;
int poz(int li,int ls,int &k,int v[100])
{ int i=li,j=ls,c,i1=0,j1=-1;
while(i<j)
{ if(v[i]>v[j])
{ c=v[j]; v[j]=v[i]; v[i]=c;
c=i1; i1=-j1; j1=c;
}
i=i+i1; j=j+j1;
}
k=i;
}
int quick(int li,int ls)
{ if(li<ls)
{ poz(li,ls,k,v);
quick(li,k-1);
quick(k+1,ls);
}
}
int main()
{ int i;
cin>>i;
for(i=1;i<=n;i++)
cin>>v[i];
quick(1,n);
for(i=1;i<=n;i++)
cout<<v[i]<<“ “;
}
Sortarea prin interclasare (MergeSort)

Algoritmul de sortare prin interclasare se bazeaza pe urmatoarea idee: pentru a


sorta o tabela cu N elemente il impartim in doua tabele pe care le sortez separat
si le interclasam.Este o metoda de sortare care foloseste strategia de baza
“divide et impera” ,conform careia problema se descompune in alte doua
subprobleme de acelasi tip si dupa rezolvarea lor rezultatele se combina.
Algoritmul sorteaza elementele in ordine crescatoare.Tabelul se imparte in n/2,
dupa aceea tabelele se impart in jumatate,tot asa pana cand tabelele formate au
mai putin sau cel mult de k elemente.
Exemplu:

Sir ordonat
12234566
2456 1236
25 46 13 26
5 2 4 6 1 3 2 6
Codul in C++ al algoritmului de sortare
prin interclasare (MergeSort)
int v[1000],n; else {k++;
int citire() a[k]=v[j];
{int i; j++;
cin>>n; }
for(i=1;i<=n;i++) if(i<=m)
cin>>v[i]; for(j=i;j<=m;j++)
} {k++;
int afis() a[k]=v[j];
{int i; }
for(i=1;i<=n;i++) else for(i=j;i<=u;i++)
cout<<v[i]<<" "; {k++;
cin>>i; a[k]=v[i];
} }
int ordo(int p,int u) for(i=1;i<=k;i++)
{int aux; v[p+i-1]=a[i];
if(v[p]>v[u]) }
{aux=v[p]; int divide(int p,int u)
v[p]=v[u]; {int m;
v[u]=aux; if(u-p<=1)
} ordo(p,u);
} else {m=(p+u)/2;
int interclas(int p,int u,int m) divide(p,m);
{int i,j,a[1000],k=0; divide(m+1,u);
i=p; interclas(p,u,m);
j=m+1; }
while(i<=m && j<=u) }
if(v[i]<v[j]) int main ()
{k++; {citire();
a[k]=v[i]; divide(1,n);
i++; afis();
} }
Sortarea cu micsorarea incrementului
(ShellSort)
Sortarea cu micsorarea incrementului (shellsort) este o extensie simplã
al Insertion sortului care câstigã vitezã permitând schimbarea
elementelor aflate departe. Shellsort necesitã mai multi pasi fatã de
Insertion sort, dar la fiecare pas elementele efectuazã salturi lungi spre
pozitia corectã.

 Exemplu-1.

 Exemplu-2.
Prezentare realizata de
-Ebîncă Cristian-Gabriel

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