Algoritmi pentru sortarea vectorilor Metoda Bulelor Buble sort

Algoritmi pentru sortarea vectorilor

Metoda Bulelor (Buble sort) • Descriere : Sortarea prin metoda bulelor este considerata una din cele mai putin efective, dar cu un algoritm mai putin complicat. Prin metoda bulelor se parcurge tabloul, de la stanga spre dreapta, fiind comparate elementele alaturate v[i] si v[i+1]. Daca se vor gasi 2 elemente neordonate valorile lor vor fi interschimbate. Parcurgerea tabloului de la stinga spre dreapta se va repeta atat timp cat nu vor fi intalnite elemente neordonate.
![Program C++: Program: int main () { int v[100], i, n, schimbat, aux; cin>>n; Program C++: Program: int main () { int v[100], i, n, schimbat, aux; cin>>n;](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-3.jpg)
Program C++: Program: int main () { int v[100], i, n, schimbat, aux; cin>>n; for(i=0; i<n; i++) cin>>v[i]; do { schimbat = 0; for(i = 0; i < n-1; i++) //parcurgem vectorul if(v[i] < v[i+1]) //daca valoarea i din vectorul a este mai mica decat cea de pe pozitia i+1 { //interschimbare aux = v[i]; v[i] = v[i+1]; v[i+1] = aux; schimbat = 1; } }while(schimbat); for(i=0; i<n; i++) cout<<v[i]<<endl; ; return 0; }

Metoda selectiei directe • Descriere: Prin aceasta metoda se aduce pe prima pozitie elementul cu valoarea cea mai mare din cele n elemente ale vectorului, apoi se aduce pe pozitia a doua elementul cu cea mai mare valoare din ultimele n-1 elemente ale vectorului, apoi se aduce pe pozitia a treia elementul cu cea mai mare valoare din ultimele n-2 elemente ale vectorului, etc.
![Program C++: • int main () • { • int v[100], n, i, j, Program C++: • int main () • { • int v[100], n, i, j,](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-5.jpg)
Program C++: • int main () • { • int v[100], n, i, j, aux; • cin>>n; • for(i=0; i<n; i++) • cin>>v[i]; • for(i=0; i<n-1; i++) • for(j=i+1; j<n; j++) • if (v[j]>v[i]) • { • aux=v[i]; • v[i]=v[j]; • v[j]=aux; • } • for(i=0; i<n; i++) • cout<<v[i]; • }

METODA SORTARII PRIN NUMARARE Această metodă necesită spaţiu suplimentar de memorie. Ea foloseşte următorii vectori: - vectorul sursă (vectorul nesortat) a; - vectorul destinaţie (vectorul sortat) b; - vectorul numărător (vectorul de contoare) k. Elementele vectorului sursă a[i] se copie în vectorul destinaţie prin inserarea în poziţia corespunzătoare, astfel încât, în vectorul destinaţie să fie respectată relaţia de ordine. Pentru a se cunoaşte poziţia în care se va insera fiecare element, se parcurge vectorul sursă şi se numără în vectorul k, pentru fiecare element a[i], câte elemente au valoarea mai mică decât a lui. Fiecare element al vectorului k este un contor pentru elementul a[i]. Valoarea contorului k[i] pentru elementul a[i] reprezintă câte elemente sunt mai mici decit el şi arată de fapt poziţia în care trebuie copiat în vectorul b.

Program C++: • • • • • #include<iostream> using namespace std; void main() { int i, j, n, a[50], b[50], k[50]={0}; cout<<"Introduceti dimensiunea sirului : "; cin>>n; for(i=0; i<n; i++) { cout<<"a["<<i<<"]="; cin>>a[i]; } for(i=0; i<n-1; i++) for(j=i+1; j<n; j++) if(a[i]>a[j]) k[i]++; else k[j]++; for(i=0; i<n; i++) b[k[i]]=a[i]; cout<<"Vectorul ordonat este : "; for(i=0; i<n; i++) cout<<b[i]<<" "; cout<<endl; }

Metoda sortării prin inserare directă • Descriere: Spre deosebire de alti algoritmi de sortare, sortarea prin insertie este folosita destul de des pentru sortarea tablourilor cu numar mic de elemente. De exemplu, poate fi folosit pentru a imbunatati rutina de sortare rapida. Sortarea prin insertie seamana oarecum cu sortarea prin selectie. Tabloul este impartit imaginar in doua parti - o parte sortata si o parte nesortata. La inceput, partea sortata contine primul element al tabloului si partea nesortata contine restul tabloului. La fiecare pas, algoritmul ia primul element din partea nesortata si il insereaza in locul potrivit al partii sortate. Cand partea nesortata nu mai are nici un element, algoritmul se opreste.
![Program C++: • int main() • { • int v[100], i, n, j, aux; Program C++: • int main() • { • int v[100], i, n, j, aux;](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-9.jpg)
Program C++: • int main() • { • int v[100], i, n, j, aux; • cin>>n; • for(i=0; i<n; i++) • cin>>v[i]; • for (i=1; i<n; i++) • { • aux=v[i]; • j=i-1; • while(j>0&&aux<v[j]) • { • v[j+1]=v[j]; • j--; • } • if(aux>=v[j]) v[j+1]=aux; • else {v[1]=v[0]; v[0]=aux; } • for(i=0; i<n; i++) • cout<<endl<<v[i]<<endl; • return 0; • }

Metoda sortării prin inserare rapidă • Descriere: Acest algoritm foloseste aceeasi impartire a vectorului in doi subvectori(sursa si destinatie), la fel ca si metoda inserarii derecte. Deoarece vectorul destinatie este un vector ordonat, cautarea pozitiei in care va fi inserat elementul v[i] se poate face nu secvential , ci prin algoritmul de cautare binara. Subvectorul destinatie este impartit in doi subvectori, se examineaza relatie de orine dintre elementul de la mijlocul subvectorului si elementul v[i] si se stabileste daca elementul v[i] va trebui inserat in prima jumatate a suvectorului sau in a doua jumatate. Operatia de divizare a subvectorului se contiunua pana se gaseste in pozitia in care urmeaza sa fie inserat v[i].
![Program C++: • • • • • • • int main() { int v[100], Program C++: • • • • • • • int main() { int v[100],](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-11.jpg)
Program C++: • • • • • • • int main() { int v[100], i, n, j, aux, st, dr, mijl; cin>>n; for(i=0; i<n; i++) {cout<<"a["<<i+1<<"]= "; cin>>v[i]; } for(i=1; i<n; i++) { aux=v[i]; st=0; dr=i-1; while (st<=dr) { mijl=(st+dr)/2; if (aux<v[mijl]) dr=mijl-1; else st=mijl+1; } j=i-1; while(j>=st) {v[j+1]=v[j]; j=j-1; } v[st]=aux; } for(i=0; i<n; i++) cout<<v[i]<<endl; return 0; }
![Metoda inserării • Descriere: • Elementle vectorului sursă a[i] se copiaza in vectorul destinaţie Metoda inserării • Descriere: • Elementle vectorului sursă a[i] se copiaza in vectorul destinaţie](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-12.jpg)
Metoda inserării • Descriere: • Elementle vectorului sursă a[i] se copiaza in vectorul destinaţie prin inserarea in poziţia corespunzătoare, astfel incât in vectorul destinaţie să fie respectată relaţia de ordine. Se vor folosi următoarele variabile: • -variabilele a si b pentru vectori • -variabila n pentru lungimea logică a vectorilor • -variabila i pentru parcurgerea vectorului sursă in vederea preluării elementului a[i] pentru a fi inserat in vectorul b • -variabila j la parcurgearea vetorului destinaţie b de la stânga la dreapta, pentru a găsi poziţia in care trebuie inserat elementul a[i] • -variabila k la parcurgerea vectorului destinaţie b de la dreapta la stânga, pentru a deplasa elementele spre dreapta pentru a elibera poziţia elemntului a[i]
![Program C++: • int main() • { • int i, j, n, k, a[50], Program C++: • int main() • { • int i, j, n, k, a[50],](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-13.jpg)
Program C++: • int main() • { • int i, j, n, k, a[50], b[50]; • cin>>n; • for(i=0; i<n; i++) • { • cout<<"a["<<i+1<<"]= "; cin>>a[i]; • } • b[0]=a[0]; • for(i=0; i<n; i++) • { • j=0; • while(j<=i-1&&a[i]>b[j]) • j++; • for(k=i; k>=j+1; k--) • b[k]=b[k-1]; • b[j]=a[i]; • } • for(i=0; i<n; i++) • cout<<b[i]<<endl; • return 0; • }

Metoda selectiei: • Prin această metodă se selectează cel mai mic element din vectorul de la pasul i+1 pana la n. Valoarea minimă este pusă în vector la poziția i, iar interschimbarea se face cu vectorii mari.
![Program: • • • • • int main () {int n, a[20], i, aux, Program: • • • • • int main () {int n, a[20], i, aux,](http://slidetodoc.com/presentation_image_h2/8bede68ba1540c575374e3649ff1b9c1/image-15.jpg)
Program: • • • • • int main () {int n, a[20], i, aux, x, y, j; cin>>n; for(i=0; i<n; i++) cin>>a[i]; for(i=0; i<n-1; i++) {y=i; x=a[i]; for(j=i+1; j<n; j++) { if (x<a[j]) {y=j; x=a[j]; }} aux=a[i]; a[i]=a[y]; a[y]=aux; } for(i=0; i<n; i++) cout<<a[i]; return 0; }
- Slides: 15