analizë e algoritmeve renditja (sortimi) · 2020. 12. 24. · analizë e algoritmeve 2 sortimet...
TRANSCRIPT
-
Analizë e algoritmeve 1
Analizë e algoritmeve
Renditja (sortimi)Elver H. Bajrami
[email protected], [email protected]
FSHMN, Departamenti i Matematikës, viti akademik 2020/21
(Kapitulli 7 në literaturë)
-
Analizë e algoritmeve 2
Sortimet
◼ Shpesh here gjatë ditës na paraqitet nevoja e renditjes së gjërave sipas një kriterit të caktuar- punët gjatë ditës të renditura me orë, ushqimet në tavolinë etj.
◼ Kjo punë në kompjuter bëhet më së shpeshti në baza të të dhënave për qëllime të caktuara
◼ Ekzistojnë disa algoritme që bëjnë sortimin por përpjekjet vazhdojnë edhe sot në përmirësimin e tyre
-
Analizë e algoritmeve 3
Sortimet
◼
-
Analizë e algoritmeve 4
2.1 Terminologjitë dhe shprehjet e sortimit
◼ Gjatë këtij kapitulli do të nënkupotojmë:
◼ Hyrja në algoritin e sortimit gjithmonëështë varg
◼ Rrokjet janë të krahasueshme ndërmjetveti varësisht nga tipi i vargut
◼ Do të marrim klasën zgjerueseComparable dhe metodën compareTome qëllim të unifikimit të problematikës
-
Analizë e algoritmeve 5
Terminologjitë dhe shprehjet e sortimit
◼
-
Analizë e algoritmeve 6
Terminologjitë dhe shprehjet e sortimit
◼ Në rastin e përgjithshëm në varg mund të përsëriten çelsat
◼ Algoritmi është i qëndrueshëm (stable) nëse nuk bënë ndrrimin e termave me vlerë të njejtë
◼ Kompleksiteti i alg. sortimit do të matet me nr. e krahasimit apo ndrrimeve të çelsave
◼ Parametër tjetër është edhe hapësira memorike e nevojshme për sortim
-
Analizë e algoritmeve 7
◼ Këtu do ti prezentojm tre algoritme më të thjeshta të sortimit
◼ Janë më të lehtë për tu kuptuar dhe implementuar, por të ngadalshëm në kryerjen e sortimit, në raste specifike edhe “të mire”
-
Analizë e algoritmeve 8
Insertion Sort
◼ Imagjinojm një grumbull të faturave të pa paguara dhe këkrojm ti rendisim ato sipasdates së arritjes
◼ Procedura e renditjes së tyre duke filluar ngady të parat e me radhë na krijon logjiken e implementimit të algoritmit Insertion Sort
◼ Ilustrojm këtë me shembullin në vazhdim
-
Analizë e algoritmeve 9
Insertion Sort
-
Analizë e algoritmeve 10
Insertion Sort
◼
-
Analizë e algoritmeve 11
Insertion Sort
Krahasimet vs nderrimet ne rastin e mire!
-
Analizë e algoritmeve 12
Bubble Sort
◼ Algoritem i thjeshte për tu implementuar
◼ Krasimi i çdo dy termave fqinjë të vargut dhevarësisht nga kjo të ndrrohen vendet apo tëecet para (bubble)
◼ for (int i=0; ii; j--)
◼ if ((A[j].compareTo(A[j-1]) < 0))
◼ DSutil.swap(A, j, j-1);
-
Analizë e algoritmeve 13
Bubble Sort
-
Bubble Sort
◼ Kompleksiteti edhe i këtij algoritmimbetet i njejt me atë paraprak, pra
◼ σ𝑖=1𝑛 𝑖 =
𝑛(𝑛+1)
2≈ 𝜃(𝑛2)
◼ Si në rastin e keq, poashtu edhe nërastet e tjera
Analizë e algoritmeve 14
-
Selection Sort
◼ I kthehemi problemit të renditjes së grumbullit të faturave, në atë mënyrë që kërkojm faturene muajit janar dhe e vendosim të paren, pasta të shkurtit e kështu me radhë
◼ Në këtë algoritëm numri i ndrrimeve është saktësisht n-1.
◼ Eshtë përmirësim i BubbleSortit në aspektin e ndrrimeve por jo edhe të krahasimeve
◼ Ideja e max dhe minsort-it ne prapavijë
Analizë e algoritmeve 15
-
Selection Sort
◼ for (int i=0; ii; j--)
◼ if (A[j].compareTo(A[lowindex]) < 0)
◼ lowindex = j;
◼ DSutil.swap(A, i, lowindex);
◼ }
Analizë e algoritmeve 16
-
Selection Sort
Analizë e algoritmeve 17
-
Përmbledhja per tre algoritmet
Analizë e algoritmeve 18
-
Shell Sort
◼ Ne kete algoritem behet krahasimi i elementeve jo fqinje te vargut (perdallim nga bubble Sort)
◼ Krijon nën vargje te cilat i renditim sipas algoritmit Insertion Sort te modifikuar, pastaj bashkon këto vargje
◼ Zakonisht fillohet me ndarjet e vargut “përafërsisht” në dy pjese
Analizë e algoritmeve 19
-
Shell Sort
Analizë e algoritmeve 20
-
Shell Sort
◼ for (int i=A.length/2; i>2; i/=2)
◼ for (int j=0; j
-
Shell Sort
◼ Nëse Shellsort-i është formuar me ndarjen me 3, mund te vërtetohet se kompleksiteti është 𝜃(𝑛1.5)
◼ Përfundimisht Shell Sort-i konsiderohet njëpërmirësim i vogël i Insertion Sort-it
Analizë e algoritmeve 22
-
2.3 Sortimet e llojit “divide & conquer” - Merge Sort
◼ Algoritëm që i takon grupit “përqaj e sundo” – përndarjen e problemit në probleme më të vogla, zgjidhjen e tyre veç e veç, dhe bashkim i zgjidhjevesi zgjidhje të problemit
◼ Merge Sort këtë e bënë duke ndarë vargun në dypjesë në mënyrë rekurzive, pastoj sorton ato kur tëarrijnë nga dy elemente me u krahasu dhe në fund, bashkimi i dy vargjeve të sortuar në një të tretë tësortuar (merge)
Analizë e algoritmeve 23
-
Merge Sort
◼ List mergesort(List inlist) {
◼ if (inlist.length()
-
Merge Sort
Analizë e algoritmeve 25
-
Merge Sort
◼ Nga konstruksioni i ndërtimit algoritmitvërejmë se në çdo hap problemi ndahetnë dy nënprobleme, përgjysmë më të
vogla, pra 𝑀 𝑛 = 2𝑀(𝑛
2)
◼ Poashtu, pas krahasimit të dy nga dytermave të vargut duhet bërë bashkimi ityre i cili ka koston n (tregoni!)
Analizë e algoritmeve 26
-
Merge Sort
◼ Prandaj kompleksiteti në rastin e
përgjithshëm është 𝑀 𝑛 = 2𝑀𝑛
2+ 𝑛
◼ Kur të zgjidhim këtë rekurzion gjejmkompleksiteti përfundimtar 𝜃(𝑛 log 𝑛) qëështë më i miri prej të gjithë që i kemishtjelluar gjer më tani
Analizë e algoritmeve 27
-
Merge Sort
◼ Një implementim standard i mergeSort-it◼ void mergesort(E[] A, E[] temp, int l, int r) {
◼ int mid = (l+r)/2; // Select midpoint
◼ if (l == r) return; // List has one element
◼ mergesort(A, temp, l, mid); // Mergesort first half
◼ mergesort(A, temp, mid+1, r); // Mergesort second half
◼ for (int i=l; i
-
Quick Sort
◼ Ky algoritëm shfrytëzon strategjin e ngjashëmme Merge Sorti, por këtu nuk bëhët ndarja nëdysh e vargut, por sipas një rregullit tëquajtur “partition with pivot element”
◼ E merr emrin quick, për arsye se në rastimesatar jep rezultatet më të mira si përkohën ashtu edhe hapësirën memorike
◼ Kompleksiteti mbetet i njejtë në rastin e përgjithshëm sikurse tek Merge Sort-it
Analizë e algoritmeve 29
-
Quick Sort
◼ void qsort(E[] A, int i, int j) { // Quicksort
◼ int pivotindex = findpivot(A, i, j); // Pick a pivot
◼ DSutil.swap(A, pivotindex, j); // Stick pivot at end
◼ // k will be the first position in the right subarray
◼ int k = partition(A, i-1, j, A[j]);
◼ DSutil.swap(A, k, j); // Put pivot in place
◼ if ((k-i) > 1) qsort(A, i, k-1); // Sort left partition
◼ if ((j-k) > 1) qsort(A, k+1, j); // Sort right partition
◼ }
Analizë e algoritmeve 30
-
Heap Sort
◼ Algoritëm i bazuar në kërkimin në drurin binar(Binary Search Tree-BST)
◼ Sjellja asimptotike e këtij algoritmi është e rangut 𝜃(𝑛 log 𝑛) në rastin e mire, të keq dhemesatar
◼ void heapsort(E[] A) {
◼ // The heap constructor invokes the buildheap method
◼ MaxHeap H = new MaxHeap(A, A.length, A.length);
◼ for (int i=0; i
-
BinSort dhe RadixSort
◼ Shembulli i faturave vjetore te grumbulluara ne tavoline, renditja e tyre sipas llojit (rryme, telefon, shërbimet e ujësjellësit etj.) dhe pastaj sipas datës
◼ Analizojmë kodin programor
◼ for (i=0; i
-
BinSort dhe RadixSort
◼ Përmirësim i vogël i algoritmit BinSort është edheBucketSort ku kemi ndarjen e indeksave të vargut ne intervale
◼ Rast i vecant ndarja e intervalin 1-100 ne 10 pjesëduke shfrytëzuar funksionet / dhe mod
◼ Që paraqet rastin e RadixSort
◼ Komplelsiteti tek ky algoritëm është 𝜃(𝑛 log 𝑛)
Analizë e algoritmeve 33
-
Përmbledhje
◼ Disa simulime empirike për algoritmet e shtjelluara në këtë kapitull (milisekonda)
Analizë e algoritmeve 34
-
Përmbledhje
◼ Disa simulime empirike për algoritmet e shtjelluara në këtë kapitull (appleta)
Analizë e algoritmeve 35