Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Metode de sortare
1. Concepte generale
Sortarea datelor este un pas important care trebuie s fie realizat nainte de aplicarea
altor algoritmi ca, de exemplu, a algoritmului de cutare.
o
Muli cercettori n informatic au petrecut mult timp dezvoltnd diverse metode de
sortare, deoarece aceti algoritmi importani n orice implementare, dar sunt i foarte
mari consumatori de timp.
o
Exemple de sortri:
Exemplu:
myArray[initial] = temp;
}
} // sfrit insertionSort()
//sort este indexul elementelor i divide irul n sortat i nesortat.
//Fiecare element sortat este pus n irul sortat numit myArray.
//temp marcheaz elementul sortat la un anumit moment de timp
//initial este un fel de cursor care merge de la dreapta la stnga atunci cnd temp //este
mai mic dect valoarea curent verificat.
Complexitatea acestui algoritm este: O(n2)
3. Sortarea prin selecie
La fiecare pas, se face o cutare liniar a elementelor nesortate pentru a se determina poziia
celui mai mare element rmas. Acest element este apoi mutat n poziia corect a irului prin
inversarea lui cu elementul ce ocup respectiva poziie.
void selectionSort(int myArray[], int number)
{
int i, j;
int min, temp;
for (i = 0; i < number-1; i++)
{
min = i;
// i este minimum
for (j = i+1; j < number; j++)
{
if (myArray[j] < myArray[min])
min = j;
}
temp = myArray[i];
myArray[i] = myArray[min];
myArray[min] = temp;
}
}// sfrit selectionSort()
Exemplu:
Complexitate: O(n2)
4. Sortarea bubble
Pentru a sorta irul S = {s0, s1, , sn-1}, sortarea bubble face n-1 treceri pin irul de date.
La fiecare pas de trecere, elementele adiacente (alturate) sunt comparate i inversate
dac este cazul. nti sunt comparate s0 i s1 ,apoi s1 i s2 etc.
Dup prima trecere prin irul de date, cel mai mare element este practic mpins pin
ir, pn n ultima poziie a acestuia.
n general, dup k treceri prin irul de date, ultimele k elemente ale irului sunt
ordonate i pot fi ignorate la paii urmtori.
Exemplu:
Complexitate: O(n2)
public void bubbleSort(int myArray[], int number)
{
int i, j;
for (j=number-1; j>1; j--)
// bucl exterioar (napoi)
{
for (i=0; i<j; i++)
// bucl interioar (n fa)
{
if( myArray[i] > myArray[i+1] )
{ temp = myArray[i];
myArray[i] = myArray[i+1];
myArray[i+1] = temp;
}
} // sfrit bucl exterioar for
} // sfrit bucl exterioar for
} // sfrit bubbleSort()
5. Quicksort
Quicksort este un algoritm de tipul divide-and-conquer (desparte i cucerete).
Algoritmii divide-and-conquer rezolv problema mprind-o n mai multe subprobleme.
Acestea sunt rezolvate recursiv, obinndu-se soluii la fiecare subproblema. n final,
soluiile subproblemelor sunt combinate i se obine soluia problemei iniiale.
Pentru a sorta irul S = {s1, s2, , sn}, se selecteaz unul dintre elementele lui S, care
se va numi pivot i se va nota cu p . Elementele rmase din S se vor muta astfel nct se
formeaz dou subiruri L i G.
L conine elementele mai mici dect p
G conine elementele mai mari dect p
L i G sunt subiruri nesortate.
Recursiv, aplicm aceeai metod pe subirurile L i G.
Algoritm:
1. Alege pivot.
2. Parcurge irul S de la stnga la dreapta pn cnd este gsit un element
s[i] >=p
3. Parcurge irul S de la dreapta la stnga pn cnd este gsit un element
s[j] <=p
4. Inverseaz elementele s[i] i s[j] dac i<=j.
5. Se repet paii 2, 3, 4 pn cnd i>j.
n acest moment irul este mprit n dou subiruri.
Se repet paii pentru fiecare subir.
mprirea n subiruri se continu pn cnd irul este complet sortat!!!
Complexitatea:
Exemplu:
9
i ->
12
10
<- j
12
10
12
10
12
10
<= pivot
9
> pivot
i aa mai departe
6. Sortarea shell
Algoritmul se bazeaz pe sortarea prin inserie dar are o performan mai bun.
A fost inventat de Donald Shell n 1959.
Complexitatea este: O(n(log n)2).
Sortarea se face prin compararea elementelor aflate la o anumit distan una de
cealalt. Dac nu sunt n ordine, ele se inverseaz. Numrul de poziii dintre ele
trebuie s scad dup fiecare parcurgere a irului.
Spaiul dintre elemente se numete distan i, n general, se alege ca fiind jumtatea
numrului de elemente din irul ce trebuie sortat.
Exemplu:
Metode de cutare
Dup aplicarea unei metode de sortare, irul de elemente este ordonat i se poate efectua mult
mai uor cutarea unui anumit element.
Tipuri de cutri:
a. Cutare liniar
b. Cutare binar
b. Cutarea binar este mai rapid dect cea liniar, mai ales n cazul irurilor de
dimensiuni mari. Mai jos este prezentat metoda de cutare binarySearch() care va gsi
elementul dorit prin mprirea irului n dou jumti aa cum este descris i n figur.
public int binarySearch(double Key)
{
int lowerLimit = 0;
int upperLimit = number-1;
int current; // current index
while(true)
{
current = (lowerLimit + upperLimit ) / 2;
if(happy[current]==Key) // happy este denumirea irului n care caut
return current;
// l-am gsit!
else if(lowerLimit > upperLimit)
return -1;
// nu pot s-l gsesc
else
// mpart irul
{
if(happy[current] < Key)
lowerLimit = current + 1; // elementul este n jumtatea superioar
else
upperLimit = current - 1; // elementul este n jumtatea inferioar
}
}
} // end find()
TEMA