Algoritmi de Sortare În Java
Algoritmi de Sortare În Java
1 - INTRODUCERE
Procesul de ordonare este unul dintre cele mai interesante mecanisme atunci când ajunge la
momentul de a arăta că există multiple soluț ii pentru aceeaș i problemă, ș i că fiecare
soluț ia algoritmică are propriile sale avantaje ș i dezavantaje.
Algoritmii de sortare ne permit, după cum spune ș i numele, să sortăm. În acest caz,
ne vor ajuta să ordonăm vectori sau matrice cu valori atribuite aleatoriu. Ne
ne vom concentra pe cele mai populare metode, analizând numărul de comparaț ii pe care le
suceden, timpul care durează ș i revizuind codul, scris în Java, fiecărui algoritm.
În această unitate vom cunoaș te mai în profunzime fiecare metodă de sortare, de la cea mai
simplu până la cel mai complex. Vor fi efectuate comparaț ii în timpul execuț iei, pre-
cerinț ele fiecărui algoritm, funcț ionalitate, domeniu de aplicare, etc.
O modalitate de a măsura eficienț a unui algoritm de acest tip este de a verifica numărul de
comparatii intre valori cheie, in plus fata de numarul de miscari care trebuie sa se efectueze
realiza între elemente (schimburi) ale listei.
Pentru a putea ordona o cantitate determinată de numere stocate într-un vector sau
matricea, există diferite metode (algoritmi) cu caracteristici ș i complexitate diferite.
Există de la metoda cea mai simplă, cum ar fi Bubblesort (sau Metoda Burbuja), care sunt
simples iteraciones, hasta elQuicksort(Método Rápido), que al estar optimizado usando
recursiune, timpul său de executie este mai scurt si este mai eficient.
2.1–METODE ITERATIVE
Aceste metode sunt simple de înț eles ș i de programat, deoarece sunt iterative, cicluri simple.
ș i sentinț e care fac ca vectorul să poată fi ordonat.
Aceste metode sunt ș i mai complexe, necesită mai multă atenț ie ș i cunoș tinț e pentru
să fie înț eleș i. Sunt rapizi ș i eficienț i, folosesc în general tehnica Împarte ș i cucereș te,
ce constă în a împărț i o problemă mare în mai multe mai mici pentru a fi mai uș or
rezolvarea lor. Prin apeluri recursive la ei înș iș i, este posibil ca timpul de
executarea ș i ordonarea să fie mai optimă.
3–METODO DE LA BURBUJA
Algoritmul sortării prin bule este una dintre cele mai cunoscute metode de sortare ș i una dintre
primii care învaț ă programatorii. Metoda bulei este una dintre cele mai
sencile ș i intuitive, este atât de uș or ca să compari toate elementele unei liste între ele
toate, si se îndeplineș te că unul este mai mare sau mai mic decât altul, atunci le schimbă poziț ia.
Consistă în compararea perechilor de elemente adiacente într-un array ș i dacă sunt dezordonate
intercambiarlos până când sunt toate ordonate.
Ș i A este array-ul de ordonat, se efectuează [Link]-1 treceri. Dacă variabila i este cea care numără
numărul de treceri, în fiecare trecere i se verifică elementele adiacente din
prima dată până la [Link]-i-1 deoarece restul până la sfârș itul array-ului este deja sortat. Dacă
elementele adiacente sunt dezordonate se schimbă.
Deja sunt ordonate, dar cele două bucle for vor continua să se execute până la final. Metoda
de ordonare a metodei buburuză în Java pentru a ordona un vector sau un tablou A este:
public static void Burbuja( int [ ] A ){
int temp;
pentru(int i=0;i<[Link]-1;i++)
pentru(int j=0;j<[Link]-i-1;j++)
dacă(A[ j ] > A[ j+1 ]){
temp=A[ j ];
A[ j ]=A[ j+1 ];
A[ j+1 ]=temp;
}
}
Observă cum se declară un vector A de tip întreg care va conț ine o cantitate n care
va fi [Link]-1 de casete, declarăm de asemenea variabilele i ș i j care ne vor ajuta să
ne deplasăm între casetă ș i casetă pentru a face comparaț iile. Ș i în cele din urmă variabila
temp, va stoca temporar valoarea de schimb între casetele care au nevoie.
3.1–BURBUJĂ SIMPLĂ
Aș a cum am descris în secț iunea anterioară, bula cea mai simplă dintre toate este cea care
compara pe toț i cu toț i, generând comparaț ii suplimentare, de exemplu, nu are sens
să se compare cu sinele său sau să se compare cu valorile anterioare lui, deoarece
presupus că, deja sunt ordonate.
Este unul dintre cele mai proaste algoritmi de sortare în ceea ce priveș te timpul de execuț ie, doar
este recomandat pentru a ordona liste cu un număr mic de elemente.
Această versiune îmbunătăț ită a algoritmului respectiv integrează o variabilă care funcț ionează ca declanș ator.
(steagul) care permite detectarea momentului în care nu mai au loc schimburi
deș i îmbunătăț irea sa nu este de obicei atât de importantă, deoarece algoritmul continuă să se comporte ca
o sortare pătratică O(n)2).
Si schimbării anterioare (cea a bulboanei îmbunătăț ite) îi adăugăm o altă schimbare, faptul că
elementele care sunt în spatele celui care este comparat, sunt deja ordonate,
comparatiile ar fi si mai putine si metoda ar fi si mai eficienta.
Ideea de bază este de a găsi cel mai mic (mare) element, în ordine ascendentă a listei, și
intercambiați-l cu elementul care ocupă prima poziție în listă, apoi se caută
următorul element mai mic și se transferă în a doua poziție. Procesul se repetă până când
ultimul element a fost transferat în poziția sa corectă.
Algoritmul de sortare depinde la rândul său de algoritmul necesar pentru a localiza componenta
mai mare (mai mic) decât un array sau vector. Este un proces foarte similar cu metoda burbuiei, dar făcând
mai eficientă căutarea și evitând schimburile inutile.
Metoda de sortare prin selecț ie în java pentru a ordona un vector sau array de întregi A
este este următorul:
//metoda java de sortare prin selecț ie
public static void seleccion(int A[]) {
int i, j, menor, pos, temp;
pentru (i = 0; i < [Link] - 1; i++) { // considerăm ca fiind cel mai mic primul
menor = A[i]; // de los elementos que quedan por ordenar
pos = i; // y păstrăm poziț ia sa
for (j = i + 1; j < [Link]; j++){ // buscamos en el resto
dacă (A[j] < menor) { // din array un element
menor = A[j]; // mai mic decât cel actual
pos = j;
}
}
dacă (pos != i){ // dacă există unul mai mic, se schimbă
temp = A[i];
A[i] = A[pos];
A[pos] = temp;
}
}
}
O altă metodă:
Public static void seleccion(int[] v) {
/* sortarea prin selecț ie */
int k=0;
pentru (int i = 0; i < [Link] - 1; i++) {
k = i;
pentru (int j = i+1; j < [Link]; j++)
dacă ( v[k] > v[j] ) k = j;
int temp = v[i];
v[i] = v[k];
v[k] = temp;
}
}
Această metodă este cunoscută ș i sub numele de "metoda jucătorului de cărț i", datorită asemănării cu
forma de clasifica cărț ile dintr-un pachet, introducând fiecare carte în locul potrivit.
Fie o listă A[1], A[2], ... A[n]. Paș ii de urmat pentru o sortare ascendentă sunt:
Sortarea prin selecț ie funcț ionează selectând cel mai mic element din matrice ș i
ducându-l la început; apoi selectează următorul mai mic ș i îl pune în
a doua poziț ie a matricei ș i aș a mai departe.
5–ORDONARE PRIN AMESTEC
1. Dacă lungimea listei este 0 sau 1, atunci este deja sortată. În alt caz:
2. Împărț iț i lista dezordonată în două subliste de aproximativ jumătate din dimensiune.
3. Aș ezaț i fiecare sublistă recursiv folosind sortarea prin interclasare.
4. Amesteca cele doua subliste intr-o singura lista ordonata.
Sortarea prin amestec încorporează două idei principale pentru a îmbunătăț i timpul său de
ejecución:
O listă mică va avea nevoie de mai puț ini paș i pentru a se ordona decât o listă mare.
Sunt necesari mai puț ini paș i pentru a construi o listă ordonată din două liste
de asemenea ordonate, care pornesc de la două liste dezordonate.
Ș i dacă ne gândim la acest algoritm recursiv, putem imagina că va împărț i lista până
a avea un element în fiecare listă, apoi îl compară cu cel de lângă el ș i în funcț ie de
coresponde, îl situează unde trebuie.
public static void mergesort (int[ ] matrice, int init, int n){
int n1, n2;
dacă (n > 1){
n1 = n / 2;
n2 = n - n1;
mergesort(matrice, init, n1);
mergesort(matrice, init + n1, n2);
combină(matrice, iniț ial, n1, n2);
}
}
private static void merge(int[] matrice, int init, int n1, int n2) {
int[ ] buffer = new int[n1+n2];
int temp = 0;
int temp1 = 0;
int temp2 = 0;
int i;
în timp ce ((temp1 < n1) && (temp2 < n2)) {
dacă (matrice[iniț + temp1] < matrice[iniț + n1 + temp2])
buffer[temp++] = matrix[init + (temp1++)];
altfel
buffer[temp++] = matrix[init + n1 + (temp2++)];
}
în timp ce (temp1 < n1) buffer[temp++] = matrice[init + (temp1++)];
6–METODA SHELLSORT
Shellsort poartă acest nume în onoarea inventorului său, Donald Shell, care l-a publicat în 1959. La
ideea de bază a acestei metode este de a distribui aranjamentul într-un mod care să genereze o matrice de
valori unde fiecare element este comparat în mod adiacent folosind un
mecanism de inserț ie directă simplă, acest interval care generează grupuri într-o manieră matricială
care este redus treptat până se stabilizează într-o valoare uniformă de 1.
Shell propune ca comparaț iile între elemente să se efectueze cu salturi mai mari.
dimensiune, dar cu creș teri descrescătoare; astfel, elementele vor rămâne ordonate mai
rapid
inc = rotunjit(n/2)
în timp ce inc > 0 {
pentru i = inc până la n–1 {
temp = a[i]
j=i
în timp ce j = inc && a[j - inc] > temp {
a[j] = a[j - inc]
j = j–inc
}
a[j] = temp
}
inc = rotunjit(inc / 2.2)
}
Această metodă este o îmbunătăț ire a algoritmului de sortare prin inserț ie (Insertsort).
avem în vedere că sortarea prin inserț ie este mult mai eficientă dacă a noastră
lista de numere este semi-ordonată ș i mută o valoare o singură poziț ie deodată.
În timpul executării acestui algoritm, numerele din listă sunt aproape sortate ș i
în final, ultimul pas sau funcț ia acestui algoritm este un simplu metodă prin inserț ie
deoarece, fiind numere aproape ordonate, este mai eficient.
public void shellSort(int[] matrice){
pentru (int increment = [Link] / 2; increment > 0; increment =
(increment == 2 ? 1 : (int) [Link](increment / 2.2))
pentru (int i = increment; i < [Link]; i++) {
pentru (int j = i; j >= increment ș i matrice[j - increment] >
matrix[j]; j -= increment){
Int temp = matrice[j];
matrix[j] = matrix[j - increment];
matrix[j - increment] = temp;
}
}
}
}
O altă metodă:
Este este algoritmul de sortare cel mai rapid. Se bazează pe tehnica divide ș i cucereș te, care
constă în a împărț i array-ul în array-uri mai mici ș i a le sorta. Pentru a face
în această diviziune, se ia o valoare din array ca pivot ș i se mută toate elementele
mai mici decât acest pivot la stânga lui, iar cei mai mari la dreapta lui. Apoi se
aplică aceeaș i metodă la fiecare dintre cele două părț i în care este împărț it array-ul.
2. Resituarea celorlalte elemente ale listei de fiecare parte a pivotului, astfel încât la un
să rămână toț i cei care sunt mai mici decât el, iar la celălalt cei mai mari. Elementele egale
pivotele pot fi plasate atât la dreapta cât ș i la stânga lor, în funcț ie de
de la implementare dorită. În acest moment, pivotul ocupă exact
locul care îi va corespunde în lista ordonată.
4. Repeta ț i acest proces în mod recursiv pentru fiecare sub-listă cât timp acestea
să conț ină mai mult de un element. Odată ce acest proces este finalizat, toate
elementele vor fi ordonate.
În cel mai rău caz, pivotul ajunge la un capăt al listei. Ordinea de complexitate a
algoritmul este atunci de O(n²). Cazul cel mai rău va depinde de implementarea
algoritm, deș i se întâmplă de obicei în liste care sunt ordonate sau aproape
ordonate. Dar în principal depinde de pivot, de exemplu algoritmul implementat
toma ca pivot întotdeauna primul element al aranjamentului, iar aranjamentul pe care îl trecem este
ordonat, va genera întotdeauna la stânga un aranjament gol, ceea ce este ineficient.
O alternativă la alegerea primului element este alegerea ca pivot a unui element ales la întâmplare din
între toț i cei din array.
O altă strategie este să calculăm mediana valorilor din stânga, centru ș i dreapta
vector.
Exemplu2: Dacă avem 3 5 4 8, practic, ceea ce face algoritmul este să împartă lista de 4
elemente în părț i egale, pe o parte 3, pe cealaltă parte 4 8 ș i ca comodin sau pivot 5.
Apoi întreabă, 3 este mai mare sau mai mic decât jokerul? Este mai mic, aș a că îl lasă deoparte.
izq. Ș i cum s-au terminat elementele de acel lado, mergem pe cealaltă parte. 4 Este mai mare sau mai mic
ce este pivotul? Mai mic, atunci îl aruncă la stânga. Apoi întreabă de 8, fiind mai mare îl
deja unde este, rămânând ceva astfel: 3 4 5 8
Exemplu3: Se marchează pivotul ș i indicii i ș i j cu literele p, i ș i j respectiv:
De forma grafică, procesul ar fi următorul:
8–COMPLEXITATE
Fiecare algoritm de sortare are prin definiț ie operaț iuni ș i calcule minime ș i
maxime pe care le realizează (complexitate), urmează o tabelă care indică cantitatea de
calculele care corespund fiecărui metodă de sortare:
9–COMPARAREA TIMPURILOR
S-a ordonat o cantitate determinată de elemente aleatorii într-o listă prin
metode diferite de sortare. (în secunde)
Aș a cum putem analiza, algoritmul care se întârzie din ce în ce mai mult timp este cel al
bule, apoi selecț ia ș i în cele din urmă inserț ia. Algoritmii care le urmează sunt Shell
ș i cel de sortare prin amestec, dar cel mai optim este „Rapid sau Quicksort”.
Se mapa un arbore binar de aș a manieră în aranjament încât nodul din poziț ia i este
părintele nodurilor în poziț iile (2*i) ș i (2*i+1).
Valoarea dintr-un nod este mai mare sau egală cu valorile copiilor săi. Prin urmare,
nodo părinte are cea mai mare valoare din întregul său subarbore.
•construieș te un aranjament ordonat de la spate spre înainte (de la mare la mic) repetând
paș ii următori:
a scoate valoarea maximă din heap (cea de la poziț ia 1)
a pune acea valoare în aranjamentul ordonat
o reconstruir el heap con un elemento menos
11–ORDONARE EXTERNĂ
Ordonarea fiș ierelor are loc atunci când volumul datelor de procesat este
prea mare ș i aceleaș i nu încap în memoria principală a computerului.
În momentul în care apare această situaț ie, metodele de sortare internă nu pot fi aplicate, astfel încât
ce ar trebui să fie considerat în alte tipuri de algoritmi pentru sortarea datelor stocate în fiș iere.
Prin ordonarea fiș ierelor se înț elege, aș adar, ordonarea sau clasificarea acestora,
ascendent sau descendent, în funcț ie de un câmp determinat la care se
denumirea va fi câmp cheie. Principalul dezavantaj al acestei ordonări este timpul de
execuț ie, din cauza operaț iunilor succesive de intrare ș i ieș ire.
Cele mai importante două metode de ordonare externă sunt cele bazate pe amestecare.
direct ș i în amestecul echilibrat.
11.1.–ORDONARE PRIN AMESTEC DIRECT
Metoda de sortare prin amestecare directă este probabil cea mai utilizată datorită uș urinț ei sale
comprehensiune.
Ideea centrală a acestui algoritm constă în realizarea succesivă a unei partiț ii ș i a unei
fuzionare care produce secvenț e ordonate de lungime din ce în ce mai mare. În prima trecere
participarea are lungimea de 1 iar fuzionarea sau amestecul produce secvenț e ordonate de
longitudine 4.
Acest proces se repetă până când lungimea secvenț ei pentru partiț ie devine mai mare sau
la fel ca lungimea secvenț ei pentru partiț ie să fie mai mare sau egală cu numărul de
elementele arhivei originale.
Exemplu: Să presupunem că se doreș te să se sorteze cheile din fiș ierul F. Pentru a realiza aș a ceva
Activitatea foloseș te două fiș iere auxiliare denumite F1 ș i F2.
F: 09 75 14 68 29 17 31 25 04 05 13 18 72 46 61
PRIMA TRECE
Partiț ie în secvenț e de lungime 1.
F1: 09 14 29 31 04 13 72 61
F2: 75 68 17 25 05 18 46
Fuzionare în secvenț e de lungime 2.
F1: 09 75 14 68 17 29 25 31 04 05 13 18 46 72 61
A doua trecută
Partiț ie în secvenț e de lungime 2.
F1: 09 75 17 29 04 05 46 72
F2: 14 68 25 31 13 18 61
Fuzionare în secvenț e de lungime 4.
F1: 09 14 68 75 17 25 29 31 04 05 13 18 46 61 72
TERCERA PASADA
Partiț ie în secvenț e de lungime 4.
F1: 09 14 68 75 04 05 13 18
F2: 17 25 29 31 46 61 72
Fuzionare în secvenț e de lungime 8.
F1: 09 14 75 25 29 31 68 75 04 05 13 18 46 61 72
SĂPTĂMÂNA ANTERIOARĂ
Partiț ie în secvenț e de lungime 8.
F1: 09 14 17 25 29 31 68 75
F2: 04 05 13 18 46 61 72
Fuziune în secvenț e de lungime 16.
F1: 04 05 09 13 14 17 18 25 29 31 46 61 68 72 75
12–EXEMPLE ÎN FLASH
Aplicatii Flash de exemplu pentru aceste metode de sortare:
[Link]
[Link]
[Link]
[Link]
SORTARE RAPIDĂ
[Link]
SORTARE SHELL
[Link]
[Link]