Вы находитесь на странице: 1из 25

Colegiul Naional Mihai Eminescu Suceava

Metode de sortare
Lucrare pentru susinerea examenului de atestat profesional la disciplina Informatic

Profesor coordonator: Pintea Eugen

Elev: Polocoer Oana Clasa a XII-a B

An colar 2013-2014

Colegiul Naional Mihai Eminescu Suceava

Cuprins
Argument Introducere 1.Metode directe Bubble Sort Selection Sort Insertion Sort 2. Metode avansate Quick Sort Merge Sort ShellSort Concluzii Imagini Bibliografie 3 4 5 5 8 10 12 12 14 17 20 20 25

Colegiul Naional Mihai Eminescu Suceava

Argument
Am ales aceast tem cu scopul de a oferi informaii importante despre sortare , care este o metod (un algoritm), prin intermediul creia se poate ordona o anumita clasa de obiecte concrete sau abstracte, dupa unul sau mai multe criterii impuse , iar cutarea este o metod, prin intermediul creia, se poate cuta, dupa criterii precizate, pentru regsirea unui anumit obiect concret sau abstract ntr-o mulime ordonat sau nu de obiecte concrete sau abstracte. n realitate, domeniul sortrii si cutarii ofer un mijloc ideal pentru analiza unor game largi de subiecte generale importante ,cum ar fi : cum se pot descoperi algoritmii buni; cum se pot optimiza algoritmii si programele; cum se poate analiza matematic eficiena algoritmilor; cum se poate alege raional cel mai bun dintre algoritmii necesari rezolvrii unei clase de probleme; cum se pot aprecia nite algoritmi ca fiind cei mai buni posibili; cum interactioneaz teoria calculelor matematice cu diverse consideraii practice; cum se pot utiliza eficient resursele calculatoarelor (memoriile interne si externe de tipul discurilor magnetice sau optice); Consider , c astfel voi ajuta la o mai bun ntelegere a sortrii ,in contextul creia fiecare aspect important al programarii i gsete rezolvarea.

Colegiul Naional Mihai Eminescu Suceava

Introducere
Definiie: Prin sortare nelegem algoritmul prin care putem rearanja k elemente ntr-o
anumit ordine (de exemplu: n ordine lexicografic, ordine cresctoare). Sortarea reprezint una dintre cele mai utilizate metode de programare. Are utilizri de la domenii precum matematic ( statistic atematic ), pn la limbi ( realizarea unor dicionare ). De aceea se impune s gsim cei mai convenabili algoritmi i s prezentm avantajele i dezavantajele acestora. Ne vom rezuma la cei mai importani. Metodele de sortare se clasific n: metode directe; metode avansate;

Metode directe de sortare


Metodele directe se bazeaz pe algoritmi de dificultate redus, uor de gsit i de neles. Metodele directe pe care le vom lua n considerare sunt : sortarea prin selecie (SelectSort), sortarea prin inserie ( InsertSort ) i sortarea cu bule ( BubbleSort ).

Metode avansate de sortare


Metodele avansate se bazeaz pe algoritmi puin mai complicai, dar care nu necesit cunotine avansate de algoritmic. Cteva din cele mai cunoscute sunt : sortarea rapid (QuickSort), sortarea prin interclasare (MergeSort) i sortarea cu micorarea incrementului( Shell or ). La fiecare metod voi descrie algoritmul, l voi exemplific n Pseudocod i C++ ( la unele metode i parametrizat), voi analiza complexitatea algoritmilor i voi propune un set de probleme. Analiznd complexitatea algoritmilor factorul cel mai important este timpul de execuie exprimat n "O-mare". Trebuie s folosim mai multe criterii pentru evaluarea timpului de execuie al algoritmului de sortare cum ar fi : numrul de pai(de atribuiri)ai algoritmului i numrul de comparaii dintre elemente necesare pentru a sorta N elemente. Al doilea factor important este cantitatea (volumul) de memorie suplimentar folosit de un algoritm de sortare. Metodele se mpart n trei tipuri: cei care sorteaz pe loc, nu folosesc memorie suplimentar, cu excepie poate o mic tabel sau stiv; cei care au o reprezentare de list nlnuit deci folosesc N cuvinte de memorie n plus pentru pointerii listei; cei care au nevoie de memorie suplimentar pentru o copie a tabelei iniiale. Recomand ca lucrarea s fie parcurs pas cu pas, ntruct nu exist un algoritm perfect. n unele cazuri metodele directe sunt mai economicoase( mai puine elemente de comparat ), n altele cele avansate sunt mai bune. De asemenea recomand nceptorilor c s utilizeze fiecare metod. 4

Colegiul Naional Mihai Eminescu Suceava

1.Metode directe
Bubble Sort
Acest metod se rezum la a compara fiecare element cu celelalte, fcndu-se interschimbarea dac elementul mai mare are indexul mai mic. Este cea mai simpl metode de sortare i nu necesit cunoaterea detaliat a limbajului de programare. Poate fi folosit cu succes de ctre nceptori. Bubble sort este o metod de sortare simpl, eficient pentru un numr mic de elemente (mai puin de 15), dar nu pentru tabele mari. Nu necesit foarte mult memorie, dar este de dou ori mai lent dect InsertionSort n aproape orice situatie. Timpul de execuie depinde de input, adic de ordinea iniial al elementelor. Dac tabela este deja sortat e nevoie de un singur pas, adic N-1 comparri. n cazul cel mai nefavorabil sunt necesare N (N-1)/2 comparri si N (N-1)/2 interschimbri. Performana algoritmului in caz general este mai greu de analizat , dar este asemntor cazului nafavorabil. Complexitatea timpului al Bubble sortului este O(N2). BubbleSort nu folosete alte structuri de date i din aceast cauz este recomandabil n cazurile cu puine elemente de sortat i n cazul n care memoria este limitat.

Colegiul Naional Mihai Eminescu Suceava Algoritmul n Pseudocod este :


simple-sort (a[Nmax+ 1]) pentru i1 pn la n pentru ji+1 pn la n daca a[i]>a[j] interschimb(a[i], a[j])

Algoritmul n C++(neparametrizat):
void BubbleSort(Tip a[Nmax+1],int Size) { for(int i=0;i<Size;i++) for(int j=i+1;j<=Size;j++) if(a[i]>a[j]) { Tip aux=v[i]; a[i]=a[j]; a[j]=aux;

} Algoritmul n C++ (parametrizat):


Void Bubblesort_para(Tip a[Nmax+1],int size) { int ok=0,i; do{ for( i=1;i<size;i++) if (a[i]>a[i+1]) {interschimba(a[i],a[i+1]);ok=1;} }while (ok==1); }
n acest caz , n cazul cel mai defavorabil numrul de comparaii este tot NC=n(n-1)/2 dar spre deosebire de cellalt algoritm este mai rapid n cazurile medii. (dac nu mai gsete dou elemente de interschimbat algoritmul se oprete.) 6

Colegiul Naional Mihai Eminescu Suceava Exemplu de sortare (irul iniial este {6, 5, 4, 3, 2, 1}):
Nr. interschimbri

6 5
5 5 5 5

5 6 4
4 4 4

4
4

3
3 3

2
2 2 2

1
1 1 1 1

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

6 3
3 3 3

6 2
2 2 2

6 1
1 1 1

6
6 6 5 6 6 6 6 6 6 6

4
4 4 4

5 3
3 3

5 2
2 2

5 1
1 1

5
5 5 5 5 5 5

3
3 3

4 2
2

4 1
1

4
4 4 4

2
2 1

3 1
2

3
3

Probleme propuse :
1. Care este numrul minim de interschimbri care vor sorta permutarea 10 11 1 5 6 7 3 4 2 9 8 2. Artai coninutul tabelei 5 89 1011 23 78 4 2 3 -1 dup a cincea interschimbare realizat prin metoda bulelor. 3. Cte operaii de comparaii se fac la primul exemplu? 4. Dup ce studiai si celelalte metode de sortare directe artai de ce BubbleSort este mai lent dect InsertionSort i dect SelectionSort precum i numrul de comparaii i interschimbri facute inutil !

Colegiul Naional Mihai Eminescu Suceava

Selection Sort
Selecia direct este una dintre cele mai simple metode de sortare i va lucra foarte bine pentru tabele mici, fiecare element (nregistrare), este mutat cel mult o dat. Implementarea algoritmului este simplu. Algoritmul presupune c la fiecare pas "i " s se gseasc elementul minim dintre a[i+1],a[i+2]...a[n] i se interschimb cu a[i].

Algoritmul este :
selection(a[nmax+1]) pentru i1 pn la n-1 { mina[i] pentru ji+1 pn la n dac (a[j] < min) mina[j] } dac (a[i]>min) interschimb(a[i],a[j])

Algoritmul n C++ este:


selection (type a[], int size) { int i, j; type min, t; for ( i=1; i<=size-1; i++ ) { min = a[i]; for ( j = i+1; j<= size; j++ ) if ( a[j]<min ) min = a[j]; if (a[i]>min) t =a[min]; a[min]=a[i]; a[i]=t; }

Colegiul Naional Mihai Eminescu Suceava

Se cheltuie cel mai mult timp cu cutarea elementului minim din partea nesortat a tabelei. Cutarea se face de la stnga la dreapta. Pe parcursul fiecrui pas este necesar o interschimbare, deci numrul interschimbrilor pentru N elemente este: N-1. Numrul total al comparatiilor este :

deci este proportional cu N2. Timpul de execuie al algoritmului este de ordinul O(N 2)n caz mediu i nefavorabil, chiar i cnd tabela este deja n ordine sortat (cresctoare).Este o metod stabil.

Exemplu (irul iniial este : {5, 6, 1, 2, 4, 3 })


Nr. interschimbri

5
1
1 1 1 1

6
6

1
5
5 3 3 3

2
2

4
4 4

3
3 3 5

1 2 3 4 5

2
2 2 2

6 6
4 4

4 6
5

5
6

Probleme propuse:
1. Artai ce conine vectorul {7 8 9 2 4 5 1 6} dupa 5 interschimbri. 2. Implementai algoritmul folosind structura repetitiv while .

Colegiul Naional Mihai Eminescu Suceava

Insertion Sort
Inseria direct aparine familiei de tehnici de sortare care se bazeaz pe metoda "juctorului de bridge". Este un algoritm aproape la fel de simplu ca Selection sort, dar poate mai flexibil. Considerm elementele A[1]...A[i-1] fiind sortate, inserm elemental A[i] n locul ce i revine. Fiind dat o tabel A cu N elemente nesortate, parcurgem tabela i le inserm fiecare element n locul propriu ntre celelalte elemente considerate sortate. Pentru fiecare i = 2...N , elementele A[1]...A[i] sunt sortate prin inserarea lui A[i] ntre lista elementelor sortate: A[1]...A[i-1]. Elementele aflate n stnga indexului sunt n ordine sortate dar nu sunt n poziia lor final. Tabela este sortat complet cnd indexul ajunge la captul drept al tabelei.

Insertion sort este un algoritm de sortare simplu, liniar: O(N) pentru tabele care contin N elemente aproape sortate. Timpul de executie al algoritmului depinde de numrul inversrilor, deci de ordinea initial al elementelor. n caz general sunt necesare N 2 /4 comparatii si interschimbri, N 2 /8 deci ordinea magnitudinii este O(N2).

n cazul cel mai nefavorabil , cnd tabela este iniial sortat n ordine invers
mutarea elementelorse realizeaz de

ori, sortarea este de O(N2) .Dac tabela A conine inregistrri mari atunci e preferabil folosirea unei"tabele de index":P, accesnd tabela original doar pentru comparare,astfel costul este mai puin. Alt modalitate de mbunttire const n folosirea unei matrici de pointeri pentru inregistrri.

Exemplu ( irul iniial este :{5,6,7,10,1,2})


Nr. Intersch.

5
1 1

6
5 2

7
6 5

10
7 6

1
10 7

2
2 10

1 2

10

Colegiul Naional Mihai Eminescu Suceava

Algoritmul este urmtorul:


insertion(a[nmax+1]) pentru i2 pn la n ji pn cnd (a[j-1]>a[i]) a[j] a[j-1] jj-1 a[j] a[i]

Algoritmul n C++ este:


insertion ( type A[ ], int size ) { int i, j; type v; for ( i = 2; i <= size; i++ ) { v = A[i]; j = i; while ( A[j-1] > v )// mut elementele cu o poziie n fa { A[j] = A[j-1]; j --; } A[j] = v;// pun elem in poz lui } }

Probleme propuse :
1. Atai coninutul tabelei: 5 6 8 9 10 15 4 7 3 -1 dupa a patra interschimbare realizat prin metoda inseriei directe. 2. S se gseasc timpul de rulare minim si maximin n funcie de N, pentru programul care folosete algoritmul InsertionSort .

11

Colegiul Naional Mihai Eminescu Suceava

2. Metode avansate
Quick Sort
n practic algoritmul de sortare cel mai rapid este Quicksort numit sortare rapid, care folosete partiionarea ca idee de baz. Pentru tabele mari. Este mai rapid dect orice metod de sortare simpl, se execut bine pentru fiiere sau tabele mari, dar ineficient pentru cele mici. Strategia de baz folosit este "divide et impera", pentru c este mai uor de sortat dou tabele mici, dect unul mare. Algoritmul este uor de implementat, lucreaz destul de bine n diferite situaii i consum mai puine resurse dect orice alt metod de sortare n multe situaii. Necesit numai n jur de NlogN operai n cazul general pentru a sorta N elemente. Metoda QuickSort presupune gsirea poziiei finale pe care o ocup elemenetul de pe prima poziie comparndu-l cu elementele din cealalt partiie a tabelului, acest algoritm realizndu-se pn cnd partiia are 1 element. Potrivit algoritmului, fiecare element este comparat cu pivoul, adic operaiunea este de O(N), tabela este divizat n dou pri, fiecare parte este divizat iari n dou. Dac fiecare parte este mprit aproximativ n jumtate, va rezulta log2N mpriri. Deci timpul de executie al Quicksortului n caz mediu este de O(N log2 N), iar n caz nefavorabil O(N2). Quicksort este o metod bun n caz general, dar nu i n caz nefavorabil cnd este preferabil folosirea a 3 indicii de impartire. Randomizarea este o idee important si folositoare, o unealt general pentru a mbuntti algoritmul. Quicksort este sensibil la ordinea datelor de intrare. Nu este o metod stabil. Dezavantajul algoritmului este c, e recursiv. Necesit n jur de N 2 de operaii n caz nefavorabil. Este fragil, o simplgreeal n implementare poate cauza o executare gresit pentru anumite fiiere.

12

Colegiul Naional Mihai Eminescu Suceava

Algoritmul este :
mparte (st,dr,p) { ist jdr ii0 jj-1 ct timp (i<j) { daca (a[i]>a[j]) { auxa[i] a[i] a[j] a[j] aux auxii ii -jj jj-aux } ii+ii jj+jj } } QuickSort(st,dr) { daca st<dr { mparte (st,dr,p)//se determin poziia p pe care o ocup primul element QuickSort (st,p-1); QuickSort (p+1,dr); } }

Algoritmul n C++ este:


13

Colegiul Naional Mihai Eminescu Suceava


Quicksort(type A[], int st, int dr) { int i,j; type v,t; if ( dr>st ) { v=A[dr]; i=st-1; j=dr; /*indice=ultimul element */ for (i=1;i<=n;i++) { while ( A[++i]< v ) while ( A[--j]> v ) if (i>=j) break; t=A[i]; A[i]=A[j]; A[j]=t; } t=A[i]; A[i]=A[r]; A[r]=t; Quicksort(A,st,i-1); Quicksort(A,i+1,dr); } }

Probleme propuse :
Scriei un program care combin algoritmii de sortare Quicksort cu Bubblesort astfel: utilizeaz Quicksort pentru obinerea de partiii nesortate de lungime m, 1< m < n, apoi utilizeaz Bubblesort pentru terminarea sortrii. 2. Scriei un program care combin algoritmii de sortare Quicksort i SelectionSort astfel: utilizeaz Quicksort obinerea de partiii nesortate de lungime m, 1< m < n, apoi utilizeaz selectare direct pentru terminarea sortrii. 1.

Merge Sort
14

Colegiul Naional Mihai Eminescu Suceava


Algoritmul de sortare prin interclasare se bazeaz pe urmtoarea idee: pentru a sorta o tabela cu N elemente l mprim n dou tabele pe care le sortez separat i le intrclasam. Este o metod de sortare care folosete strategia de baza "divide et impera", conform creia problema se descompune n alte dou subprobl eme de acelai tip i dup rezolvarea lor rezultatele se combin. Algoritmul sorteaz elementele n ordine cresctoare. Tabelul se mparte n n/2, dup aceea tabelele se mpart n jumtate, tot aa pn cnd tabelele formate au mai puin sau cel mult de k elemente (n cazul nostru k=2-este cel mai uor s compari 2 elemente).

Algoritmul presupune :
1. 2. 3. 4. Afl mijlocul tabelului . Sorteaz prima jumatate a tabelului . Sorteaz a doua jumtate a tabelului. mbina cele 2 jumti.

Algoritmul n Pseudocod este :


Mergesort(st,dr) { daca (dr>st) M(st+dr)/2 Mergesort(st,m) Mergesort(m+1,dr) pentru im+1 pn la 1 b[i-1]=a[i-1] pentru jm pn la dr b[m+dr-st]=b[j+1] pentru k=1 pn la dr { daca (b[i]<b[j]) a[k] =b[i] altfel a[k]=b[j] ii+1 jj-1 } }

Algoritmul n C++ este:

15

Colegiul Naional Mihai Eminescu Suceava


void mergesort(int A[],int st,int m,int dr) { int b[100]; int i,j,k; i=0; j=st; // copiem prima jumatate a vectorului a in b while(j <=m) b[i++]=A[j++]; i=0; k=st;// copiem inapoi cel mai mare element la fiecare pas while(k <j &&j <=dr) if(b[i]<=a[j]) a[k++]=b[i++]; else a[k++]=a[j++]; // copiem elementele ramase daca mai exista while(k<j) a[k++]=b[i++]; } void merge(int A[],int st,int dr) { if(st<dr) { int m=(st+dr)/2; merge(A,st,m); merge(A,m+1,dr); mergesort(A,st,m,dr); } }

Majoritatea muncii este cuprins n comparare i copiere.n procedura Merge fiecare element din subtabele este comparat: asta este o operaie de O(N), copierea elementelor din tabela temporal n cea original tot O(N). Deci procedura Merge este de O(N). Procedura Mergesort este recursiv i Merge este apelat recursiv pentru ambele jumti. Astfel putem impri tabela de log2N ori i de fiecare dat executm de O(N) procedura Merge. Algoritmul total este de O(N log2N) n toate cele trei cazuri. Este o metod stabil . Nu este sensibil la ordinea iniial al elementelor.Dezavantajul Mergesort-ului este c necesit o tabel auxiliar de mrimea originalului. Problema apare cnd tabela este mare i spaiu este un factor critic.

Probleme propuse :
1. Cte comparaii va folosi Mergesort pentru a sorta cheile: 4,6,5,1,4,7, -1,2,8,9? 16

Colegiul Naional Mihai Eminescu Suceava


2. Modificai algoritmul Mergesort ca s obinei un algoritm de sortare prin interclasarea listelor cu dou ci. 3. Scriei un program care folosete algoritmul de sortare prin interclasare cu dou ci pentru N=1000 de inregistrri, cmpul cheie fiind de tip ir de caracter . 4. Comparai algoritmele bazate pedivide et impera MergeSort i QuickSort prin implementarea pe un ir format din 3500 elemente.( acestea se pot da prin folosirea funciei random())

ShellSort
17

Colegiul Naional Mihai Eminescu Suceava


Sortarea cu micorarea incrementului (shellsort) este o extensie simpl al Insertion sortului care ctig vitez permind schimbarea elementelor aflate departe. Ideea de baz o constituie rearanjarea elementelor din tabela A n aa fel nct, lund fieca re a h-a element (ncepnd de oriunde), s obinem o tabel sortat. Astfel spunem c tabela este h-sortat. O tabel , h-sortat este format din h subtabele sortate independent, intercalate. Folosind astfel o procedur pentru fiecare secven a valorii lui h care se termin n 1, va produce o tabel sortat.

Algoritmul este urmtoul:


shell-sort (a) h1 pn cnd h<n/9 h3*h+1 pn cnd h>0 pentru ih+1 pn la n ta[i] ji pn cnd (j>h i a[j-h] > t) interschimb(a[j], a[j-h]) jj-h h h/3

Exemplu

Algoritmul n C++ este:


Shellsort(int A[], int n) {
18

Colegiul Naional Mihai Eminescu Suceava


int i, j, h, v; for (h = 1; h <= n/9; h = 3*h+1); for ( ; h > 0; h /= 3 ) for (i = h+1; i <= n; i += 1) { v = A[i]; j = i; while ( j>h && A[j-h]>v ) { A[j] = A[j-h]; j - = h; } A[j] = v; } }

Eficiena algoritmului Shell sort este greu de analizat, greu de comparat cu alte metode, nici timpul de rulare nu este cunoscut sigur. Pentru acest program n legtura cu timpul de rulare exist dou presupuneri : N(log 2 N)2 si N 3/2. Timpul de execuie nu este sensibil n mod particular la ordinea iniial al elementelor. Insertion sort este mai lent pentru c schimb doar elementele adiacente. Shellsort nu efectuaz mai mult de N comparaii (pentru creterile: 1, 4, 13, 40,121,....). Shellsort este metod aleas pentru multe aplicaii de sortare pentru c are un timp de execuie accesibil chiar i pentru o tabel moderat de mare (mai puin de 5000 elemente) i este o metod stabil.

Probleme propuse :
1. 2. S se gseasc un algoritm eficient pentru construirea permutrilor care vor maximiza numrul de deplasri n algoritmul Shellsort. Dai un exemplu pentru a arta de ce 8, 4, 2, 1 nu ar fi o alegere bun de a termin o secvent de cretere Shellsort.

19

Colegiul Naional Mihai Eminescu Suceava

Concluzii :
Algoritmul
Insertion Sort Buble Sort Selection Sort Shell Sort Merge Sort Quick Sort

Complexitatea
O(n2) O(n2) O(n2) O(n3/2 ) (estimat) O(nlog2) O(nlog2n)-caz mediu O(n2)-caz defavorabil

Metodele directe sunt mai bune pentru tabelurile cu puine elemente (<100), pentru c cele avansate sunt ineficiente pe aceste tabele, dar pentru vectorii cu multe elemente metodele avansate sunt foarte eficiente. Una dintre cele mai bune metode este ShellSort, dar timpul de execuie este foarte greu de analizat, aadar pentru tabele mari este mai bun QuickSort.

Imagini
Bubble Sort
20

Colegiul Naional Mihai Eminescu Suceava

Selection Sort

21

Colegiul Naional Mihai Eminescu Suceava

Insertion Sort

Quick Sort
22

Colegiul Naional Mihai Eminescu Suceava

Merge Sort

23

Colegiul Naional Mihai Eminescu Suceava

Shell Sort

24

Colegiul Naional Mihai Eminescu Suceava

Bibliografie
Manualul de informatic clasa a XI-a , autori: Vlad Huanu i Tudor Sorin www.wikipedia.ro www.software.ucv.ro www.apaal.wordpress.com www.sortari.weebly.com www.cforbeginners.com www.info.mcip.ro Manualul de informatic intensiv XI ,Autor: Mariana Milosescu www.algorex.3x.ro

Introducere in algoritmi de Thomas H.Corme,Charles Leiserson, Ronald R.Rivest

25

Вам также может понравиться