You are on page 1of 56

Leksion 3 25/03/2014

1
ALGORITMIKE DHE
PROGRAMIM I AVANCUAR
Algoritma te renditjes
1
Algoritme te Renditjes
Disa nga algoritmet e renditjes per tu trajtuar:
1. Selection Sort
2. Insertion Sort
3. Merge Sort
4. Bubble Sort

Tipi abstrakt i te dhenave mbi te cilin do te
implementojme keto algoritme do te jete
VEKTORI.

2
Leksion 3 25/03/2014
2
Algoritme te Renditjes
Problemi i renditjes
Input: Nje sekuence numrash a
1
, a
2
, . . . , a
n
.
Output: nje kombinacion/renditje e inputit e tille qe
a
1
a
2
a
n
.
Keto sekuenca zakonisht ruhen ne vektor
Sekuences rritese te numraveve {1,2, 3 n} i referohemi si
celesa. Me cdo celes lidhim nje informacion shtese.
Do te shohim disa menyra per te zgjidhur problemet e
renditjes.
Secila menyre do te shprehet si algoritem - procedure
llogaritese e cila merr nje vlere, apo bashkesi vlerash, si input
dhe kthen nje vlere apo bashkesi vlerash si output.
3
Selection Sort
4
7 2 8 5 4
2 7 8 5 4
2 4 8 5 7
2 4 5 8 7
2 4 5 7 8
Pas cdo iteracioni caktohet pozicioni i nje elementi.
Leksion 3 25/03/2014
3
Selection Sort
Algoritmi
Nga i = 0 deri (i < n 1)
(a) min = a[i]
(b) lock = i
Nga j = i + 1 deri (j < n)
if (a[j] < min)
(a) min = a[j]
(b) lock = j
if (lock ! = i)
(a) swap = a[i]
(b) a[i] = a[loc]
(c) a[lock] = swap

5
Selection Sort
6
void selectionsort(int *a,int n)
{
int i,j,temp;
for(i=0;i< n1;i++)
for(j=i+1;j < n;j++)
if (a[i]>a[j])
{
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
Leksion 3 25/03/2014
4
Analiza mbi ekzekutimin e Selection sort
7
Selection Sort
Rasti me i mire
f (n) = O(n)

Rasti me i keq
f(n) = (n(n 1))/2 = O(n
2
)

Mesatarja
f(n) = (n(n1))/2 = O(n
2
).

8
Leksion 3 25/03/2014
5
Insertion Sort - Algoritmi
Nga i = 1 deri ne n.
(a) Swap = A [i],
(b) Pos = i 1
While (Swap < A[Pos] dhe (Pos >= 0))
(a) A [Pos+1] = A [Pos]
(b) Pos = Pos-1
A [Pos +1] = Swap

9
Insertion Sort

10
23 17 45 18 12 22
1
2 6 5 4 3
Leksion 3 25/03/2014
6
Insertion Sort
23 17 45 18 12 22
1
2 6 5 4 3
1
2 6 5 4 3
Insertion Sort
23
17 45 18 12 22
1
2 6 5 4 3
1
2 6 5 4 3
Leksion 3 25/03/2014
7
Insertion Sort
23 17
45 18 12 22
1
2 6 5 4 3
1
2 6 5 4 3
Insertion Sort
23 17 45
18 12 22
1
2 6 5 4 3
1
2 6 5 4 3
Leksion 3 25/03/2014
8
Insertion Sort
18 12 22 17 23 45
1
2 6 5 4 3
1
2 6 5 4 3
Insertion Sort
void insertionsort(int *a,int n)
{ int i,j, k;
for(j=1;j < n;j++)
{
k=a[j];
for(i=j1;i>=0 && k<a[i];i--)
a[i+1]=a[i];
a[i+1]=k;
}
}
Leksion 3 25/03/2014
9
Insertion Sort
17
Insertion Sort
Rasti me i mire???
Vektori eshte i renditur qe ne fillim
n -1 instruksione koha e ekzekutimit e
rendit O(n)

Rasti me i keq???
Vektori eshte i renditur ne rend te kundert
n(n=1)/2 -1 instruksione koha e
ekzekutimit e rendit O(n
2
)
18
Leksion 3 25/03/2014
10
Merge Sort Divide-and conquer
Divide-and conquer eshte nje paradigem disenjimi i algoritmeve:
Divide: ndan bashkensine S te inputit ne dy nenbashkesi S1 dhe S2.
Recur: zgjidhen problemet e lidhura me S1 dhe S2.
Conquer: kombinohen zgjidhjet e S1 dhe S2 qe te japin zgjidhjen per S.


Merge-sort ne nje sekunece inputi S me n elemente konsiston ne tre
hapa:
Divide: ndahet S ne dy sekuneca S1 dhe S2 me afersisht n/2 elemente
secila
Recur: renditen ne menyre rekursive S
1
dhe S
2
Conquer: bashkohet S
1
dhe S
2
ne nje sekunece unike te renditur

19
Merge Sort
Merge
(Bashko)
Pjesa e pare Pjesa e dyte
Pjesa e pare
Pjesa e dyte
A
Rradhitja
rekursive
Ndarja ne pjese
Vektori i Rradhitur
Leksion 3 25/03/2014
11
Merge Sort

Algorithm mergeSort(S, C)
Input sequence S with n
elements, comparator C
Output sequence S sorted
according to C
if S.size() > 1
(S
1
, S
2
) partition(S, n/2)
mergeSort(S
1
, C)
mergeSort(S
2
, C)
S merge(S
1
, S
2
)
Merge Sort : Merge
A[middle] A[left]
Sorted
FirstPart
Sorted
SecondPart
A[right]
merge
A:
A:
Sorted
Leksion 3 25/03/2014
12
Hapi i Bashkimit te dy sekuencave te renditura
Hapi Conquer (hapi i bashkimit) te merge sort ka te beje me
bashkimin e dy sekuencave te renditura A dhe B ne nje
sekuence te renditur S e cila perban te gjithe elementet e A dhe
B.

Kjo procedure ka nje kompleksitet te rendit O(n)
23
Merge Sort : Merge
Merge(A, left, middle, right)
i left; j middle +1
create array L[right - left]
k 0
while i < middle

&

j < right
if A[i] < A[j]
L[k++] A[i++]
else
L[k++] A[j++]
while i < middle

L[k++] A[i++]
while j < right

L[k++] A[j++]
for(i= left;i< right;i++)
A[i]=L[i-left];

Leksion 3 25/03/2014
13
Merge Sort
6 10 14 22 3 5 15 28
L: R:
Temporary Arrays
5 15 28 30 6 10 14 5 2 3 7 8 1 4 5 6
A:
Merge Sort
3 5 15 28 30 6 10 14
L:
A:
3 15 28 30 6 10 14 22
R:
i=0 j=0
k=0
2 3 7 8 1 4 5 6
1
Leksion 3 25/03/2014
14
Merge Sort
1 5 15 28 30 6 10 14
L:
A:
3 5 15 28 6 10 14 22
R:
k=1
2 3 7 8 1 4 5 6
2
i=0 j=1
Merge Sort
1 2 15 28 30 6 10 14
L:
A:
6 10 14 22
R:
i=1
k=2
2 3 7 8 1 4 5 6
3
j=1
Leksion 3 25/03/2014
15
Merge Sort
1 2 3 6 10 14
L:
A:
6 10 14 22
R:
i=2 j=1
k=3
2 3 7 8 1 4 5 6
4
Merge Sort
1 2 3 4 6 10 14
L:
A:
6 10 14 22
R:
j=2
k=4
2 3 7 8 1 4 5 6
i=2
5
Leksion 3 25/03/2014
16
Merge Sort
1 2 3 4 5 6 10 14
L:
A:
6 10 14 22
R:
i=2
j=3
k=5
2 3 7 8 1 4 5 6
6
Merge Sort
1 2 3 4 5 6 14
L
:
A:
6 10 14 22
R
:
k=6
2 3 7 8
1 4 5 6
7
i=2 j=4
Leksion 3 25/03/2014
17
Merge Sort
1 2 3 4 5 6 14
L:
A:
6 10 14 22
R:
k=6
2 3 7 8
1 4 5 6
7
i=2 j=4
Merge Sort
1 2 3 4 5 6 7 8
L:
A:
3 5 15 28 6 10 14 22
R:
2 3 7 8 1 4 5 6
i=4
j=4
k=8
Leksion 3 25/03/2014
18
Merge Sort
mergesort(int a[], int low, int high)
{ int mid;
if(low<high)
{
mid=(low+high)/2;
mergesort(a,low,mid);
mergesort(a,mid+1,high);
merge(a,low,high,mid);
}
return(0);
}

Merge Sort
merge(int a[], int low, int high, int mid)
{ int i, j, k, c[50];
i=low; j=mid+1; k=low;
while((i<=mid)&&(j<=high))
{ if (a[i]<a[j])
c[k++] = a[i++];
else
c[k++] = a[j++];
}
while(i<=mid)
c[k++] = a[i++];
while(j<=high)
c[k++] = a[j++];
for(i=low;i<k;i++)
a[i]=c[i];
}

Leksion 3 25/03/2014
19
Merge Sort
6 2 8 4 3 7 5 1
A:
MERGE_SORT(A, 0, 7)
Merge Sort
6 2 8 4
3 7 5 1
Merge-Sort(A, 0, 3)
Ndarja
A:
Leksion 3 25/03/2014
20
Merge Sort
3 7 5 1
8 4
6 2
Merge-Sort(A, 0, 1)
Ndarje
A:
Merge Sort
3 7 5 1
8 4
6
2
Merge-Sort(A, 0, 0)
Ndarje ne element te vetem
A:
Leksion 3 25/03/2014
21
Merge Sort
3 7 5 1
8 4
6 2
Merge-Sort(A, 0, 0), return
A:
Merge Sort
3 7 5 1
8 4
6
2
Merge-Sort(A, 1, 1)
A:
Leksion 3 25/03/2014
22
Merge Sort
Merge-Sort(A, 1, 1), return
3 7 5 1
8 4
6 2
A:
Merge Sort
3 7 5 1
8 4
2 6
Merge(A, 0, 0, 1)
A:
Leksion 3 25/03/2014
23
Merge Sort
Merge-Sort(A, 0, 1), return
3 7 5 1
8 4 2 6
A:
Merge Sort
3 7 5 1
8 4
2 6
Merge-Sort(A, 2, 3)
ndarje
A:
Leksion 3 25/03/2014
24
Merge Sort
3 7 5 1
4
2 6
8
Merge-Sort(A, 2, 2)
A:
Merge Sort
3 7 5 1
4
2 6
8
Merge-Sort(A, 2, 2), return
A:
Leksion 3 25/03/2014
25
Merge Sort
4
2 6
8
Merge-Sort(A, 3, 3)
A:
3 7 5 1
Merge Sort
3 7 5 1
4
2 6
8
Merge-Sort(A, 3, 3), return
A:
Leksion 3 25/03/2014
26
Merge Sort
3 7 5 1
2 6
4 8
Merge(A, 2, 2, 3)
A:
Merge Sort
3 7 5 1
2 6 4 8
Merge-Sort(A, 2, 3), return
A:
Leksion 3 25/03/2014
27
Merge Sort
3 7 5 1
2 4 6 8 Merge(A, 0, 1, 3)
A:
Merge Sort
3 7 5 1 2 4 6 8
Merge-Sort(A, 0, 3), return
A:
Leksion 3 25/03/2014
28
Merge Sort
3 7 5 1
2 4 6 8
Merge-Sort(A, 4, 7)
A:
Merge Sort
1 3 5 7
2 4 6 8
A:
Merge (A, 4, 5, 7)
Leksion 3 25/03/2014
29
Merge Sort
1 3 5 7 2 4 6 8
Merge-Sort(A, 4, 7), return
A:
Merge Sort
1 2 3 4 5 6 7 8
Merge(A, 0, 3, 7)
A:
Merge-Sort(A, 0, 7)
Leksion 3 25/03/2014
30
Merge Sort - Analiza
Lartesia h e pemens qe krijohet nga merge-sort eshte O(log n)
Ne cdo thirrje rekursive e ndajme pemen ne dy gjysma te njejta
Numri i veprimeve per nyjet me thellesi i eshte O(n)
Ne ndajme dhe bashkojme 2
i
sequenca me madhesi n/2
i

Behen 2
i+1
thirrje rekursive
Koha e pergjithshme e ekzekutimit eshte e rendit O(n log n)

59
depth #seqs size
0 1 n
1 2 n/2

i 2
i
n/2
i

Merge Sort : Analiza

cn
2 cn/2 = cn
4 cn/4 = cn
n/2 2c = cn
log n nivele
Kompleksiteti : O(n logn)
Total: cn log n
n
n/2 n/2
n/4 n/4 n/4 n/4
2 2 2
Leksion 3 25/03/2014
31
Bubble Sort
Duke filluar nga elementi i pare deri tek
elementi i parafundit behet krahasimi me
elementin pasardhes dhe nese elementi
pasardhes eshte me i vogel atehere
ndryshojne vendet.

Kjo perseritet n here dhe ne kete rast kemi
vektorin e rradhitur.
Bubble Sort
5 12 35 42 77
101
1 2 3 4 5 6
5 12 35 42 77
101
1 2 3 4 5 6
Swap
42 77
5 12 35 77 42
101
1 2 3 4 5 6
Swap
35 77
Leksion 3 25/03/2014
32
Bubble Sort
5 12 77 35 42
101
1 2 3 4 5 6
Swap
12 77
5 77 12 35 42
101
1 2 3 4 5 6
Nuk ka zevendesim
5 77 12 35 42
101
1 2 3 4 5 6
Swap
5 101
77 12 35 42 5
1 2 3 4 5 6
101
Vlera me e madhe e vektorit
Bubble Sort
index <- 1
last_compare_at <- n 1
loop
exitif(index > last_compare_at)
if(A[index] > A[index + 1]) then
Swap(A[index], A[index + 1])
endif
index <- index + 1
endloop
Leksion 3 25/03/2014
33
Bubble Sort
77 12 35 42 5
1 2 3 4 5 6
101
5 42 12 35 77
1 2 3 4 5 6
101
42 5 35 12 77
1 2 3 4 5 6
101
42 35 5 12 77
1 2 3 4 5 6
101
42 35 12 5 77
1 2 3 4 5 6
101
N

-

1

Bubble Sort
void bubblesort(int *a,int n)
{
int i,j,k,temp;
for(i=1;i < n;i++)
for(j=0;j < n1;j++)
if (a[j] > a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
Leksion 3 25/03/2014
34
Bubble Sort (Shembull 1)
Marrim serine e numrave pothuajse te renditur

67
Seria e numrave per tu renditur
(pothuajse e renditur)
Sa instruksione duhet te kryejme per te marre
serine e renditur?

Kompleksiteti i rendit O(n
2
)
Bubble Sort (Shembull 1)
68
Seria e renditur
Leksion 3 25/03/2014
35
Bubble Sort (Shembull 2)
69
Seria e numrave e parenditur (pothuajse e renditur)
Kompleksiteti i rendit O(n)
Bubble Sort
Rasti me i mire
f (n) = O(n)

Rasti me i keq
f(n) = (n(n 1))/2 = O(n
2
)

Mesatarja
f(n) = (n(n1))/2 = O(n
2
).
Leksion 3 25/03/2014
36
Quicksort
71
Sic duket edhe nga emri, quicksort eshte algoritmi me i
shpejte i njohur ne praktike. Kompleksiteti i tij eshte O(n
log n).

Shpejtesia e tij lidhet me nje cikel te brendshem te
optimizuar.

Ne rastin me te keq ka kompleksitet O(n
2
) por kjo eshte
ngjarje e pamundur ne menyre eksponenciale.

Ashtu si Mergesort eshte algoritem rekursiv i tipit Perca
dhe Sundo.
Algoritmi per QuickSort
72
Algoritmi baze per renditjen e nje vektori S
konsiston ne hapat e meposhtem:
1. Nqs numri i elementeve te S eshte 0 ose 1,
perfundo.
2. Zgjidh nje element v ne S. Ky quhet pivot.
3. Ndaj bashkesine S - {v} ne dy grupe te
ndryshme S
1
= {x S - {v}| x v}, dhe S
2
= {x S -
{v}| x v}.
4. Therrasim quicksort(S
1
) te ndjekur nga v te
ndjekur nga quicksort(S
2
)}.

Leksion 3 25/03/2014
37
Pershkrmi i quicksort
73
Mqs pjesa e ndarjes nuk na tregon si te veprojme me
elementet e barabarte me pivot, kjo konsiderohet si
vendim i dizenjimit te algoritmit.
Nje implementim i mire do te ishte ai qe e trajton kete
pjese ne menyre sa me eficente.
Ne menyre intuitive mund te mendojme qe gjysma e
elementeve te barabarte me pivot te shkojne ne S1 dhe
gjysma tjeter ne S2 pak e shume si ne rastin e pemes
binare te kerkimit per ta bere ate te balancuar.
74
Leksion 3 25/03/2014
38
Aplikimi i Quicksort mbi nje bashkesi
75
1. Pivot zgjidhet rastesisht vlera 65.

2. Pjesa e mbetur e elementeve ndahen ne dy nenbashkesi me te
vogla.

3. Aplikohet ne menyre rekursive e njejta procedure per bashkesite e
reja.

4. Njelloj si mergesort, ai ne menyre rekursive zgjidh dy
nenprobleme, dhe kerkon pune lineare shtese (hapi 3).

5. Ndryshe nga Mergesort , nenproblemet nuk garantohen te jene te te
njejtes madhesi, gje qe prezupozohet te jete ane negative.

6. Arsyeja qe Quicksort eshte i shpejte eshte qe faza e ndarjes, mund
te ekzekutohet ne vend ne menyre eficente. Kjo eficense eshte me
e mire per thirrje rekursive mbi bashkesi me madhesi te ndryshme.

Detaje te quicksort
76
Hapi 2 dhe 3 mund te implementohen ne menyre te
ndryshme.
Metoda e meposhtme eshte rezultat i analizave dhe
studimeve te shumta empirike dhe paraqet nje menyre
eficente per te implementuar Quicksort-in.
Derivimi me i vogel prej kesaj metode mund te sjelle
rezultate jo te mira
1. Zgjedhja e Pivot
2. Strategjia e ndarjes
3. Skedaret e vegjel
4. Analiza e veprimeve te quicksort
5. Koha lineare e pritur per algoritmin e selektimit

Leksion 3 25/03/2014
39
Zgjedhja e pivot
77
Megjithesse algoritmi i pershkruar, funksionon
njelloj pavaresisht cili element zgjidhet si pivot,
disa zgjedhje e bejne me te mire algoritmin se
disa te tjere.
Zgjedhja e Pivot/Zgjedhje e keqe
78
Te perdoret elementi i pare si pivot.
Eshte e pranueshme nqs inputi eshte random, por nqs
eshte i renditur qe me pare, ose i renditur ne rend te
kundert,, te gjithe elementet do shkojne ne S1 ose ne S2.
Me keq akoma qe kjo ndodh ne te gjitha thirrjet rekursive.
Nga ana praktike nqs vektori eshte i renditur, quicksort do
te kerkoje kohe kuadratike ekzekutimi per te mos bere
asgje mbi vektor.
Ne pergjithesi, bashkesite e renditura, (ose me pjese te
medha te renditura brenda tyre), jane te shpeshta,
rrjedhimisht do te ishte ide e keqe te perdoret zgjedhja e
elementit te pare si pivot.

Leksion 3 25/03/2014
40
Zgjedhja e Pivot /Zgjedhje e sigurte
79
Zgjedhja e pivot ne menyre random.

Zgjedhje e sigurte sepse pervec rastit kur
gjeneratori i numrave random ka nje defekt, eshte
shume e rralle qe te gjenerohen gjithmone numra
pivot qe japin gjithmone nje ndarje te keqe te
bashkesive.

Gjeneratoret e numrave random jane te
kushtueshem per nga koha e ekzekutimit dhe nuk
zvogelojne kohen mesatare te ekzekutimit te
pjeses tjeter te algoritmit.
Zgjedhja e Pivot/Zgjedhja e mire
80
Median i nje grupi prej n numrash quhet elementi i n/2 ne
radhe nqs keto numra i rendisim (kemi renditje
paraprake!!!).
Zgjedhja me e mire do te ishte pikerisht mediani i
bashkesise.
Por kjo do te ishte e veshtire per tu llogaritur dhe do te
ngadalesonte Quicksort-in ne menyre te konsiderueshme.
Nje zgjidhje do te ishte te zgjidhen rastesisht 3 vlera nga
bashkesia dhe te merret mediani i tyre.
Por rastesia nuk ndihmon shume prandaj gjejme medianin e
elementit majtas, me ate djathtas, dhe me ate ne mes.
Leksion 3 25/03/2014
41
81
Psh per nje input 8, 1, 4, 9, 6, 3, 5, 2, 7, 0
Majtas = 8
Djathas = 0
Mes = (0+9)/2 => si pozicion = 6
Mesi = pivot = 6
Eleminohet rasti i keq i bashkesise se renditur
(Bashkesite e reja jane me madhesi te
barabarte)
Reduktohet me 5% koha e ekzekutimit te
quicksort.
Strategjia e ndarjes
82
Ka disa menyra, dhe mund te behet e njejta gje me humbje
ne eficense, ne menyre te gabuar.
Do te shohim nje metode te njohur.
Nderrojme vendin e pivot me elmementin e fundit.

8 1 4 9 0 3 5 2 7 6
i j

Supozojme qe te gjithe elementet jane te ndryshem nga njeri-
tjetri

Leksion 3 25/03/2014
42
Strategjia e ndarjes
83
Qellimi i ndarjes: te levize te gjithe elementet me te vegjel se
pivot majtas dhe te gjithe elementet me te vegjel se pivot
djathtas.
Me te Vegjel dhe Me te Medhenj jane dy bashkesite fqinje
te pivot.
Ndersa i eshte majtas j, levizim i djathtas, duke kapercyer
elementet me te vegjel se pivot. Levizim j majtas duke
kapercyer elementet me te medhenj se pivot.
Kur i dhe j ndalojne, i shenjon ne nje element te madh dhe j
shenjon ne nje element te vogel (ne krahasim me pivot).
Nqs i eshte ne te majte te j, elementet kembejne vendet.
Qellimi eshte te levizim elementet e medhenj djathtas dhe
elementet e vegjel majtas.
Ne shembullin me siper i nuk do te levize, ndersa j do te levize
nje pozicion.
Situata eshte si me poshte:

Strategjia e ndarjes
84
8 1 4 9 0 3 5 2 7 6
i j
Nderrojme vendet e elementeve i dhe j
2 1 4 9 0 3 5 8 7 6
i j
2 1 4 9 0 3 5 8 7 6
i j
Nderrojme vendet e elementeve i dhe j
2 1 4 5 0 3 9 8 7 6
i j
2 1 4 5 0 3 9 8 7 6
j i
i dhe j kapercyen njera tjetren prandaj perfundon iteracioni
Pivot nderron vendin me elementin ku shenjon i
2 1 4 5 0 3 6 8 7 9

Leksion 3 25/03/2014
43
Strategjia e ndarjes
85
Dime qe cdo element i < p (i dhe p jane
indekse, p indeksi i pivot), eshte i tille qe
vlera e elementit ne indeksin i eshte me e
vogel se vlera e elementit ne indeksin p.

Per i > p (i dhe p jane indekse, p indeksi i
pivot), eshte i tille qe vlera e elementit ne
indeksin i eshte me e madhe se vlera e
elementit ne indeksin p.
Strategjia e ndarjes
Si te trajtojme celesat e barabarte me pivot?
86
Ceshtja eshte nqs duhet te ndaloje i kur gjen nje celes te
barabarte me pivot, apo te ndaloje j kur gjen nje celes te
barabarte me pivot?
Ne menyre intuitive mund te themi qe i dhe j duhet te sillen
njelloj.
Nqs i ndalon, ndersa j nuk ndalon atehere te gjitha celesat e
barabarte me pivot do perfundojne ne S2
Konsiderojme rastin kur te gjithe elementet jane te barabarte.
Nqs i dhe j ndalojne do te kemi disa shkembime midis i dhe j.
Pavaresisht se kjo duket e pavlefshme, efekti pozitiv eshte qe
i dhe j do te kapercehen ne mes, prandaj kur pivot
zevendesohet, do te krijohen dy nenbashkesi me madhesi
pothuajse te njejta.
Sipas mergesort koha e ekzekutimit do te jete O(n log n).
Leksion 3 25/03/2014
44
Strategjia e ndarjes
Si te trajtojme celesat e barabarte me pivot?
87
Nqs as i dhe as j nuk ndalojne, do te arrijne kufinjte e
bashkesise.
Megjithese kjo duket si praktike e mire, pivot do te
nderroje vendin me i, me fillimin apo fundin e bashkesise
ne varesi te implementimit. Kjo do te krijoje bashkesi me
madhesi shume te ndryshme.
Nqs te gjithe elementet jane te barabarte koha e
ekzekutimit do te jete O(n
2
).
Efekti eshte i njejte si ne perdorimin e pivot, elementin e
pare te bashkesise kur kemi bashkesi te renditur.
Kohe kuadratike ekzekutimi per te mos bere asgje!
Strategjia e ndarjes
Si te trajtojme celesat e barabarte me pivot?
88
Eshte me mire te kryejme hapa te panevojshem dhe te krijojme
bashkesi me madhesi te njejta se sa te rrezikojme nenbashkesi me
diference.
Do te marrim i dhe j qe ndalojne nqs gjejne celes te njejte me pivot.
Eshte mundesia e vetme qe nuk kerkon kohe kuadratike ekzekutimi.

Ne pamje te pare nuk ia vlen te shqetesohesh per bashkesi me
elemente te njejte, askush nuk kerkon te rendise bashkesi me elemente
te njejte,
Por quicksort eshte rekursiv!
Supozojme kemi 10 000 elemente nder te cilet 5 000 jane te njejte.
Quicksort do te therrase ne menyre rekursive mbi keta 5 000 elemente.
Prandaj eshte e rendesishme qe kjo thirrje te behet ne menyre sa me
optimale.
Leksion 3 25/03/2014
45
Quick Sort
4 8 6 3 5 1 7 2
A:
QUICK_SORT(A, 0, 7)
QUICK SORT
2 3 1
5 6 7 8 4
Quick-Sort(A, 0, 2)
A:
Ndarja
Leksion 3 25/03/2014
46
QUICK SORT
2
5 6 7 8 4
1
1 3
Quick-Sort(A, 0, 0) , return
QUICK SORT
2
5 6 7 8 4
1
3 3 Quick-Sort(A, 1, 1)
Leksion 3 25/03/2014
47
QUICK SORT
5 6 7 8 4 2 1 3
2 1 3
Quick-Sort(A, 0, 2)
QUICK SORT
4 2 1 3
5 6 7 8 5
Quick-Sort(A, 4, 7)
Ndarja
Leksion 3 25/03/2014
48
QUICK SORT
4
5
6 7 8 6 6
2 1 3
Quick-Sort(A, 5, 7)
Ndarja
QUICK SORT
4
5
6
7 8 7
2 1 3
Quick-Sort(A, 6, 7)
Ndarja
Leksion 3 25/03/2014
49
QUICK SORT
4
5
6
7
2 1 3
Quick-Sort(A, 7, 7)
8
8
QUICK SORT
4
5
6
8 7
2 1 3
Leksion 3 25/03/2014
50
QUICK SORT
4
5
6
8 7
2 1 3
QUICK SORT
4 2 1 3 5 6 8 7
Leksion 3 25/03/2014
51
QUICK SORT /RASTI ME I MIRE
T = (nlogn)
cn
2 cn/2 = cn
4 c/4 = cn
n/3 3c = cn
log n nivele
n
n/2 n/2
n/4
3 3 3
n/4
n/4 n/4
QUICK SORT/RASTI ME I KEQ
cn
c(n-1)
3c
2c
n
n-1
n-2
3
2
c(n-2)
T= (n
2
)
Leksion 3 25/03/2014
52
QUICK SORT
103
void quick_sort( int a[ ], int n )
{
q_sort( a, 1, n );

}
104
int median3( int a[], int left, int right )
{
int center;
center = (left + right) / 2;
if( a[left] > a[center] )
swap( &a[left], &a[center] );
if( a[left] > a[right] )
swap( &a[left], &a[right] );
if( a[center] > a[right] )
swap( &a[center], &a[right] );
/* a[left] <= a[center] <= a[right] */
swap( &a[center], &a[right] ); /* hiq pivot*/
return a[right]; /* kthen pivot */
}
Leksion 3 25/03/2014
53
105
void q_sort( input_type a[], int left, int right )
{
int i, j;
input_type pivot;
if( left <= right )
{
pivot = median3( a, left, right );
i=left; j=right-1;
for(;;)
{
while( a[i] < pivot ) i++;
while( a[j] > pivot ) j--;
if( i < j )
swap( &a[i], &a[j] );
106
else
break;
}
swap( &a[i], &a[right] ); /*rivendos
pivot*/
q_sort( a, left, i-1 );
q_sort( a, i+1, right );
}
}

Leksion 3 25/03/2014
54
Ndryshim ne pjese te algoritmit
107
i=left+1; j=right-2;
for(;;)
{
while( a[i] < pivot ) i++;
while( a[j] > pivot ) j--;
if( i < j )
swap( &a[i], &a[j] );
else
break;
}
Aplikime te algoritmit
108
Te gjendet elementi i k-te me i madh ne nje
bashkesi.
E quajme kete algoritem quickSelect mqs
eshte i ngjashem me quickSort.
Le te jete |S
i
| numri i elementecve ne S
i
.
Hapat e quickselect jane:


Leksion 3 25/03/2014
55
Aplikime te algoritmit
109
Nqs |S| = 1, atehere k = 1 kthe elementet ne S si pergjigje
Prn rendit S dhe kthe k elementet me te vegjel.
Zgjidh nje pivot v nga S
Ndaj bashkesine S - {v} ne S
1
dhe S
2
, njelloj sic behet me
quicksort.
Nqs k< |S
1
|, atehere elementi I k-te me I vogel do te
ndodhet ne S
1
, prandaj kthe quickselect (S
1
, k).
Nqs k = 1 + |S
1
|, atehere pivot eshte elementi i k-te me i
vogel.
Prn elementi i k-te me i vogel ndodhet ne S
2
, prandaj
kthjejme quickselect (S
2
, k - |S
1
| - 1).
Quick Select
110
Ndryshe nga quickSort, quickSelect ben 1 thirrje
rekursive ne vend te 2.

Rasti me i keq eshte njelloj si ne rastin e quickSort,
pra O(n
2
).

Kjo sepse rasti me i keq i quick sort eshte kur njera
nga bashkesite eshte bosh, prandaj quickSelect ne
kete rast nuk po kursen nje thirrje rekursive.

Koha mesatare e ekzekutimit eshte O(n).


Leksion 3 25/03/2014
56
Quick Select
111
//k te kalohet me vlere te pershtatshme midis 0 dhe N
void q_select(int a[], int k, int left, int right)
{
int i, j;
int pivot;
if( left <= right )
{
pivot = median3( a, left, right );
i=left; j=right-1;
for(;;)
{
while( a[i] < pivot ) i++;
while( a[j] > pivot ) j--;
if (i < j )
swap( &a[i], &a[j] );
Quick Select
112
else
break;
}
swap( &a[i], &a[right-1] ); /* vendos pivot */
if( k < i)
q_select( a, k, left, i-1 );
else
if( k > i )
q-select( a, k, i+1, right );
else
return a[i]; //pivot eshte elementi i k-te
}
}

You might also like