Sunteți pe pagina 1din 27

Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library)

Tipuri de sortări. Când şi ce folosim?

Curs Algoritmi Fundamentali


Algoritmi de sortare

Universitatea Transilvania din Braşov


Facultatea de Matematică şi Informatică

2023
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Agenda

1 Diverse tipuri de sortări (O(n2 ))

2 Diverse tipuri de sortări (O(n ∗ log n))

3 Sortarea în STL (Standard Template Library)

4 Tipuri de sortări. Când şi ce folosim?


Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortări?

Problema sortării este o problemă clasică în algoritmică. Alegerea


unui algoritm de sortare potrivit depinde de diverse criterii, cum ar fi
dimensiunea datelor, natura datelor (sortare de numere, şiruri de
caractere, obiecte complexe), resursele disponibile (timp şi memorie)
şi alte cerinţe specifice ale problemei.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortare prin selecţie. Exemplu

Ideea de bază este de a gasi cel mai mic (sau cel mai mare, în
funcţie de ordinea dorită) element din lista şi a-l plasa la început.
Acest proces se repetă pentru restul elementelor, găsind mereu cel
mai mic element rămas şi plasându-l pe poziţia corespunzătoare.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortarea prin selecţie

Cum calculăm complexitatea?


Pn Pn Pn n∗(n+1)
i=1 j=i+1 1 = i=1 (n − i) = n ∗ n − 2
T (n) ∈ Θ(n2 )
De obicei, cazul favorabil pentru sortări este atunci când tabloul e
deja sortat. Cum este această situaţie la sortarea prin selecţie?
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortarea prin metoda bulelor. Exemplu

Acesta lucrează prin parcurgerea repetată a listei, comparând


elementele consecutive şi interschimbându-le dacă nu sunt în
ordinea corectă. Acest proces continuă până când niciun element nu
mai este interschimbat în timpul unei treceri complete prin lista.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortarea prin metoda bulelor

Cum calculăm complexitatea?


Caz favorabil Θ(n)
Caz defavorabil Θ(n2 )
Caz mediu Θ(n2 )
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Interclasare

Ce înseamnă "a interclasa"?


Interclasarea clasică (2 şiruri sortate, rezultă interclasarea lor
într-un al treilea şir, tot sortat)
Complexitatea este...?
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

MergeSort. Exemplu
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

MergeSort. Pseudocod

Algoritmul împarte recursiv array-ul în jumătate până când ajunge la


array-uri de dimensiune 1, apoi le combină în ordine crescătoare,
folosind o operaţie de interclasare (merge).
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

MergeSort. Complexitate (I)

Este vorba despre un algoritm recursiv, deci stabilim relaţia de


recurenţă T (n) = 1, n ≤ 1 şi T (n) = 2 ∗ T ( n2 ) + n, altfel
T (n) = 2 ∗ T ( n2 ) + n, presupunem n = 2k , adică avem:
T (2k ) = 2 ∗ T (2k −1 ) + 2k şi obţinem T (n) ∈ Θ(n ∗ log2 n). Cum?
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

MergeSort. Complexitate (II)

Altă variantă de a deduce complexitatea:


Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

MergeSort - Recap

MergeSort are complexitatea Θ(n ∗ log2 n)


Θ(n ∗ log2 n) este cea mai bună complexitate posibilă pentru un
algoritm de sortare. Există şi algoritmi cu complexitate mai mică,
dar ei funcţionează pentru date care îndeplinesc diferite condiţii.
MergeSort nu este un algoritm in-place.
Obţinerea unei complexităţi mai bune are un cost. Care?
Un alt algoritm cu această complexitate este QuickSort - sortare
cu partiţionare
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Algoritm de sortare prin pivotaj

Algoritmul QuickSort este un algoritm de sortare prin pivotaj. Astfel,


subliniem câteva idei pentru construirea/alegerea unui pivot:
Se alege o valoare aleatorie din tablou (prima, ultima sau una
arbitrară), aceasta reprezentând valoarea pivotului
Se rearanjează elementele tabloului astfel încât toate elementele
care sunt mai mici decât valoarea aleasă să se afle în prima
parte (stânga) a tabloului, iar valorile mai mari decât pivotul să se
afle în partea a doua (dreapta) a tabloului
Se pune valoarea pivotului pe poziţia sa finală (astfel încât în
stânga să avem elementele mai mici decât pivotul, iar în dreapta,
elementele mai mari ca valoarea pivotului)
Un bun pivot împarte tabloul curent în două subtablouri de dimensiuni
apropiate (partiţionare echilibrată). Alegerea unui bun pivot este
direct proporţională cu obţinerea unei complexităti mai bune.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Implementare
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Selecţie pivot (mediana)

log15
2 ≈4

4 treceri prin toate elementele tabloului sau 4 paşi de partiţionare


integrală a tabloului.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Performanţa algoritmului QuickSort

Timpul de rulare al acestui algoritm depinde de partiţionare: dacă


este sau nu realizată într-un mod balansat. Dacă partiţionarea
este una balansată, algoritmul are timp de rulare Θ(n ∗ log n), în caz
contrar ordinul de timp fiind unul pătratic.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Complexitate caz favorabil

În cel mai favorabil caz, pivotul este plasat în cadrul fiecărei


subprobleme pe poziţia din mijloc a subtabloului, în această situaţie
problema fiind descompusă în două subprobleme de aceeaşi
dimensiune. Recurenţa este dată de:
n
T (n) = 2 ∗ T ( ) + Θ(n)
2
ce are ca soluţie
T (n) = n ∗ log n
.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Complexitate caz defavorabil (I)

Acesta are loc atunci când, procedura de partiţionare produce o


regiune cu n − 1 elemente şi alta cu 1 element.
Arborele de recursivitate pentru care partiţia separă şirul în 1,
respectiv n − 1 elemente.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Complexitate caz defavorabil (II)

Cum partiţionarea va avea un timp liniar Θ(n) şi T (1) = Θ(1), formula
de recurenţă pentru timpul total este:

T (n) = T (n − 1) + Θ(n)

Cum evaluăm această relaţie de recurenţă?


Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Complexitate caz mediu (I)

Să luăm acum cazul cel mai probabil, adică cel în care este posibil ca
elementele să nu fie nici perfect balansate şi nici total nebalansate.
Să presupunem că procedura de partiţionare produce o repartizare
de 90% elemente într-o parte, 10% în cealaltă, dintr-un total de 100%
elemente. Vom obţine o recurenţă:

9n n
T (n) = T ( ) + T ( ) + Θ(n)
10 10
9n n
T (n) = T (
) + T( ) + n
10 10
Fiecare nivel de recurenţă are un cost total de n, până când condiţia
limită este îndeplinită pentru o adâncime de log10 n = Θ(log n). Astfel
costul total este Θ(n ∗ log n), deci algoritmul este tot în timp n ∗ log n
(baza diferă)
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Complexitate caz mediu (II)

Arborele de recursivitate în care partiţia produce întotdeauna o


repartizare de 9 la 1.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

QuickSort - Avantaje şi dezavantaje

(+) necesită, în cazul mediu, O(log2 n) memorie suplimentară,


mult mai redusă decât sortarea prin interclasare.
(+) cea mai bună alegere când viteza este foarte importantă,
indiferent de dimensiunea setului de date
(-) poate duce la umplerea stivei când se utilizează seturi largi de
date
(-) în cazul cel mai defavorabil performanţa metodei scade
catastrofal (când la fiecare partiţionare este selectată cea mai
mare (cea mai mică) valoare ca şi pivot, dar şi când avem
duplicate)
(-) algoritmul de sortare rapidă este sensibil la ordinea datelor de
intrare (nu este o metodă stabilă)
(-) are performanţe slabe în cazul sortărilor banale, atunci când
operează asupra unor liste aproape ordonate.
(+/-) are performanţe deosebite în cazul tablourilor dezordonate
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortarea în Standard Template Library

Introsort este un algoritm de sortare hibrid care oferă performanţe


medii rapide şi performanţe asimptotic optime. Algoritmul începe să
lucreze cu QuickSort, dar când recursivitatea atinge o anumită
adâncime algoritmul continuă sortarea cu ajutorul metodei HeapSort.
Algoritmul foloseşte, de asemenea, insertion sort când numărul de
elemente de sortat este destul de mic.
Introsort-ul, ca si QuickSort-ul, nu este stabil (nu păstrează ordinea
elementelor echivalente) de aceea este înca nevoie de o cerinţă
separată pentru o sortare stabilă. În STL, cerinţele pentru sortarea
stabilă sunt scrise printr-un algoritm MergeSort pentru a fi
satisfăcătoare (std::stable_sort).
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Sortarea în Standard Template Library

C++ STL oferă posibilităţi de sortarea a unui vector sau un array


(elemente cu acces aleatoriu). Algoritmul de sortare este definit in
biblioteca <algorithm>.
Variantele sunt următoarele:
(1): elementele sunt comparate folosind operatorul "<"
(2): elementele sunt comparate folosind o funcţia binară de
comparare (boolean). Funcţia nu trebuie să modifice niciunul dintre
argumentele sale.
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Tipuri de sortări

Metoda selecţiei: + cel mai intuitiv mod de sortare, - chiar şi cel
mai perfect sortat input, necesită minim o parcurgere, + se
foloseşte când faci ceva rapid şi "dirty", + in-place
Metoda bulelor: + util pentru seturi mici de date, + uşor de
implementat, + in-place, - eficienţă redusă
MergeSort: + poate fi folosit pentru date de orice mărime, +
stable, - nu e in-place, + se foloseşte intens pentru sortarea de
linked list, unde accesul secvenţial este necesar
QuickSort: + rapid în cazuri de date random, + in-place, chiar
daca e recursiv, + rapid (ciclul repetititv din interior este foarte
scurt şi se poate optimiza foarte bine), + are performanţe
deosebite în cazul tablourilor dezordonate, - foarte nesigur
pentru cazul defavorabil (O(n2 )), - performanţe slabe pentru
tablourile banale
https://www.toptal.com/developers/sorting-algorithms/
Diverse tipuri de sortări (O(n2 )) Diverse tipuri de sortări (O(n ∗ log n)) Sortarea în STL (Standard Template Library) Tipuri de sortări. Când şi ce folosim?

Ce (criterii) contează în alegerea unui algoritm de sortare?

Cantitatea de date pe care dorim să le sortăm


Cât de sortate sunt deja datele
Complexitatea de timp (diferă de running time)
Algoritm stabil sau nu?
Complexitatea de spaţiu

S-ar putea să vă placă și