Você está na página 1de 26

Colegiul Naional Mihai Eminescu Suceava

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

Profesor coordonator:

Elev:

Pintea Eugen

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

2
3
4
4
7
9
11
11
14
17
19
20
25

Colegiul Naional Mihai Eminescu Suceava

Argument
Am ales aceast tem cu scopul de a oferi informa ii 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 mul ime
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 gse te
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

Colegiul Naional Mihai Eminescu Suceava


comparat ), n altele cele avansate sunt mai bune. De asemenea recomand nceptorilor c
s utilizeze fiecare metod.

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{
6

Colegiul Naional Mihai Eminescu Suceava


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.)

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


Nr.
interschimbri

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

6
4

3
3

2
2
2

1
1
1
1

5
5
5
5

4
4
4
4

3
3
3

2
2
1

4
4
4

5
3
3
3

4
2
2

6
3

6
2

3
3
3

2
2
2

5
2

5
1

2
2

1
1

4
1

3
1

4
4
4

6
1
1
1
1

5
5
5
5
5
5
5

6
6
6
5
6
6
6
6
6
6
6

Probleme propuse :
1. Care este numrul minim de interschimbri care vor sorta
7

Colegiul Naional Mihai Eminescu Suceava


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])

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 )
8

Colegiul Naional Mihai Eminescu Suceava


min = a[j];
if (a[i]>min)
t =a[min];
a[min]=a[i];
a[i]=t;
}

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

1
2
3
4
5

1
1
1
1

5
3
3
3

6
6

4
4

3
3
5

2
2
2

4
4

4
6

Probleme propuse:
1. Artai ce conine vectorul {7 8 9 2 4 5 1 6} dupa 5 interschimbri.
9

Colegiul Naional Mihai Eminescu Suceava


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.

10

Colegiul Naional Mihai Eminescu Suceava


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

10

1
2

1
1

5
2

6
5

7
6

10
7

2
10

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 :

11

Colegiul Naional Mihai Eminescu Suceava


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 .

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.

12

Colegiul Naional Mihai Eminescu Suceava


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.

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);
13

Colegiul Naional Mihai Eminescu Suceava


}
}

Algoritmul n C++ este:


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 :
14

Colegiul Naional Mihai Eminescu Suceava


1.

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.

Merge Sort
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 subprobleme 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]
15

Colegiul Naional Mihai Eminescu Suceava


altfel a[k]=b[j]
ii+1
jj-1
}
}

Algoritmul n C++ este:


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).
16

Colegiul Naional Mihai Eminescu Suceava


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?
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())

17

Colegiul Naional Mihai Eminescu Suceava

ShellSort
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 fiecare 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

18

Colegiul Naional Mihai Eminescu Suceava

Algoritmul n C++ este:


Shellsort(int A[], int n)
{
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.

19

Colegiul Naional Mihai Eminescu Suceava

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.

Concluzii :
Algoritmul

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

Insertion Sort
Buble Sort
Selection Sort
Shell Sort
Merge Sort
Quick Sort

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.

20

Colegiul Naional Mihai Eminescu Suceava

Imagini
Bubble Sort

21

Colegiul Naional Mihai Eminescu Suceava

Selection Sort

Insertion Sort

22

Colegiul Naional Mihai Eminescu Suceava

Quick Sort

23

Colegiul Naional Mihai Eminescu Suceava

Merge Sort

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
25

Colegiul Naional Mihai Eminescu Suceava

Introducere in algoritmi de Thomas

H.Corme,Charles Leiserson, Ronald


R.Rivest

26

Você também pode gostar