Академический Документы
Профессиональный Документы
Культура Документы
Metode de sortare
Lucrare pentru susinerea examenului de atestat profesional la disciplina Informatic
An colar 2013-2014
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
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.
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;
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.
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;
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 !
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])
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.
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 .
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.
5
1 1
6
5 2
7
6 5
10
7 6
1
10 7
2
2 10
1 2
10
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
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
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); } }
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
Algoritmul presupune :
1. 2. 3. 4. Afl mijlocul tabelului . Sorteaz prima jumatate a tabelului . Sorteaz a doua jumtate a tabelului. mbina cele 2 jumti.
15
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
ShellSort
17
Exemplu
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
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
Selection Sort
21
Insertion Sort
Quick Sort
22
Merge Sort
23
Shell Sort
24
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
25