Documente Academic
Documente Profesional
Documente Cultură
Complexitate
Ludmila NOVAC
Dr., conf. univ.
Dep. Informatică
Unităţi de conţinut
1. Tehnici de sortare. Noţiunea de sortare şi tipuri de sortare.
Sortarea bazată pe comparaţii, aprecierea algoritmilor de
sortare. Algoritmi de sortare prin interschimbare. Metoda
bulelor, sortarea bazată pe metoda „Divide et Impera”
(sortare rapidă - quicksort). Aprecierea complexităţii.
Îmbunătăţirile algoritmului de sortare rapidă.
2. Algoritmi de sortare prin inserţie. Inserţia simplă
recursivă, inserţia simplă iterativă. Sortarea prin metoda lui
Shell. Algoritmi de sortare prin interclasare (mergesort).
Aprecierea complexităţii.
3. Algoritmi de sortare prin selecţie. Selecţia simplă. Selecţia
sistematică (piramidală, arborescentă - heapsort). Aprecierea
complexităţii.
Tehnici de sortare şi
Algoritmi de sortare
Stabilitatea poate fi o cerinţă definitoare, de exemplu când are loc sortarea după o anumită
cheie a elementelor deja sortate după o altă cheie.
Exemplu: lista studenţilor care este deja sortată după numele se cere de aranjat după anul
de studii, dar pentru fiecare an de studii numele trebuie să rămână în ordinea alfabetică.
Clasificarea algoritmilor de sortare (1)
Putem clasifica algoritmii de sortare după o serie de criterii. Cei mai cunoscuţi
algoritmi sunt cei prin comparaţie, iar cel mai comun criteriu de clasificare a
acestora este după metoda generală de lucru.
Astfel avem algoritmi de sortare prin:
Inserţie:
• Insertion sort – un algoritm de sortare eficient pe liste de intrare mici sau
aproape sortate,
• Shellsort,
• Binary tree sort,
• Cyclesort – un algoritm cu numărul de scrieri în memorie redus
Selecţie:
• Selectionsort – eficient pe liste de intrare mici
• Heapsort – un algoritm de sortare cu timp de execuţie constant
• Smoothsort – inspirat de Heapsort, dezvoltat de către Edsger Dijkstra
Algoritmii de sortare prin inserţie şi selecţie sunt în general algoritmi care nu
pot fi uşor paralelizaţi, dar pot fi folosiţi împreună cu alţi algoritmi pentru a
forma algoritmi de sortare hibrizi. Mai avem algoritmi de sortare prin:
Partiţionare:
• Quicksort – unul dintre cei mai cunoscuţi algoritmi de sortare
• Introsort – un hibrid între Quicksort şi Heapsort.
Clasificarea algoritmilor de sortare (2)
Interclasare (merging):
• Mergesort
• Timsort – este un hibrid între Mergesort şi Insertion sort
Distribuire:
• Bucketsort
• Din formula aceasta rezultă că mărimile n-1, n, 2n, n+3 au unul şi acelaşi ordin O(n).
Iar mărimea n2 are un ordin mai mare.
• Algoritmul de sortare a n elementele bazat pe compararea cheilor are complexitatea
minimă O(n) sau mai mare.
• SELECTION-SORT(A)
1. for j ← 1 to n-1
2. smallest ← j
3. for i ← j + 1 to n
4. if A[ i ] < A[ smallest ]
5. smallest ← i
6. Exchange A[ j ] ↔ A[ smallest ]
Metoda de sortare prin selecţie
Eficienţa
Metoda de sortare prin selecţie
Eficienţa
Metoda de sortare prin selecţie
Eficienţa
• 4 3 51 2
• 1| 3542
• 1 2|543
• 1 2 3|45
• 1 2 34|5
• 1 2 3 4 5
Metoda Heap (piramidală, arborescentă) de
sortare (Heap Sort)
Heapsort este un algoritm care face parte din familia algoritmilor de sortare prin
selecţie. Deşi este mai lent în practică decât Quicksort sau Mergesort,
acesta are avantajul de a avea atât numărul mediu de comparaţii cât şi
numărul maxim de comparaţii de Ο(n log (n)). Heapsort nu este un algoritm
stabil. Algoritmul este mai complex decât Quicksort sau Mergesort.
Paşii algoritmului sunt:
• Creează un arbore binar din elementele listei de intrare cu proprietatea că
fiecare nod din arbore va fi mai mare decât oricare dintre descendenţii
acestuia. Aceasta se numeşte şi heap property. Astfel nodul rădăcină va fi
cel mai mare element din arbore.
• Elementul rădăcină va fi scos / şters din arbore şi concatenat listei sortate.
• Se reface arborele în aşa fel încât cel mai mare element din arbore să
devină noua rădăcină. Aceasta se întâmplă prin operaţia de sift-up.
• Algoritmul se reia până când toate elementele au fost concatenate listei
sortate, iar arborele nu va mai conţine nici un element.
34
Metoda Heap de sortare. Pseudocod
http://www.algorithmist.com/index.php/Heap_sort
Metoda Heap de sortare. Pseudocod
Heapsort(A) {
BuildHeap(A)
for i <- length(A) downto 2 {
exchange A[1] <-> A[i]
heapsize <- heapsize -1
Heapify(A, 1)
}
BuildHeap(A) {
heapsize <- length(A)
for i <- floor( length/2 ) downto 1 Heapify(A, i)
}
Heapify(A, i) {
le <- left(i)
ri <- right(i)
if (le<=heapsize) and (A[le]>A[i])
largest <- le
else largest <- i
if (ri<=heapsize) and (A[ri]>A[largest])
largest <- ri
36
if (largest != i) {
Metoda Heap (piramidală, arborescentă) de sortare
Exemplu
Metoda Heap (Exemplu. Criteriu de selecţie)
Metoda Heap de sortare. Exemplu
Metoda Heap de sortare. Exemplu
Criteriu de selecţie (Min-Heap)
Întrebări frecvente
• http://www.norsemathology.org/wiki/index.php?title=-WiP-_Lauren_Lykowski%27s_Project
Aprecierea algoritmilor de sortare
https://www.infopulse.com/blog/timsort-sorting-algorithm/
Aprecierea algoritmilor de sortare
45
Lucrarea de laborator nr.2
„ Metode de sortare”
Termen 3 săptămâni
Să se creeze un fişier textual care conţine cel puţin 50 de înregistrări, cu cel puţin 5 câmpuri
şi are cel puţin 2 tipuri de date, iar câmpul cheie trebuie să fie unic şi neordonat.
Fişierul creat este cel de la prima lucrare de laborator.
Să fie realizat un program în C++, în care sunt implementate câteva metode de sortare (cel
puţin două) în tabele neordonate după câmpul cheie din fişierul textual creat anterior.
Pentru fiecare metodă de sortare de analizat complexitatea teoretică şi practică.
Să se afişeze următoarele date:
Estimarea teoretică a complexităţii; Număr de comparaţii; Număr de
permutări; Timpul de execuţie al fiecărui algoritm de sortare.
De descris algoritmul metodelor de căutare pe paşi.
+ Metoda bulelor (Bubble Sort)
+ Metoda de inserţie (Insertion Sort)
+ Metoda de selecţie (Selection Sort)
+ Metoda rapidă de sortare (Quick Sort)
+ Metoda Shell de sortare (Shell Sort)
+ Metoda Heap (piramidală, arborescentă) de sortare (Heap Sort)