Kuplalajittelu (bubble sort)Kuplalajittelu (bubble sort)
Verrataan vierekkäisiä taulukon alkioita ja vaihdetaan niiden paikkaa tarvittaessa
Jokaisella iteraatiolla pienin alkio lajittelemattomien joukosta ”kuplii” oikealle paikalleen lajiteltujen joukkoon
Kuplalajittelu (bubble sort)Kuplalajittelu (bubble sort)
Kuplalajittelu C-kielelläKuplalajittelu C-kielellä
void kuplalajittelu(alkio a[], int l, int r) { int i, j; for(i = l; i <= r; i++) for(j = r; j > i; j--) VERTVAIHDA(a[j - 1], a[j]);
}
lajitellaan a[l]..a[r]
Käydään kaikki alkiot läpi
Kuplalajittelun analyysiKuplalajittelun analyysi
Huonoimmassa tapauksessa suoritetaan n(n-1)/2 vertailua ja vaihtoa n-1 i n-1
i=1 j=11= i=1i=n(n-1)/2
Kuorilajittelu (shellsort)Kuorilajittelu (shellsort)
h-lajittelu sekvenssille lisäyksiä, päättyen arvoon 1 Esim. 3280-lajittelu, sitten 1093-lajittelu, sitten
364-lajittelu, sitten 121-lajittelu, sitten 40-lajittelu, sitten 13-lajittelu, sitten 4-lajittelu ja lopuksi 1-lajittelu
Menetelmän tehokkuus perustuu alkioiden siirtämiseen pitkiä matkoja
Ensin 13-lajittelu, Ensin 13-lajittelu, sitten 4-lajittelusitten 4-lajittelu
A S O R T I N G E X A M P L EA E O R T I N G E X A M P L S
A E O R T I N G E X A M P L SA E O R T I N G E X A M P L SA E N R T I O G E X A M P L SA E N G T I O R E X A M P L SA E N G E I O R T X A M P L SA E N G E I O R T X A M P L SA E A G E I N R T X O M P L SA E A G E I N M T X O R P L SA E A G E I N M P X O R T L SA E A G E I N M P L O R T X SA E A G E I N M P L O R T X S
1-lajitellaan,1-lajitellaan,4-lajiteltu tiedosto4-lajiteltu tiedosto
A I A G E L E M P S N R T X OA I A G E L E M P S N R T X OA A I G E L E M P S N R T X OA A I G E L E M P S N R T X OA A E G I L E M P S N R T X OA A E G I L E M P S N R T X OA A E E G I L M P S N R T X OA A E E G I L M P S N R T X OA A E E G I L M P S N R T X OA A E E G I L M P S N R T X OA A E E G I L M N P S R T X OA A E E G I L M N P R S T X OA A E E G I L M N P R S T X OA A E E G I L M N P R S T X OA A E E G I L M N O P R S T
X
Kuorilajittelu (shellsort)Kuorilajittelu (shellsort)
void kuorilajittelu(alkio a[], int l, int r) { int i, h; for(h = 1; h <= (r - l) / 9; h = 3 * h + 1) ; for(; h > 0; h /= 3) for(i = l + h; i <= r; i++) { int j = i; alkio v = a[i]; while(j >= l + h && PIENEMPI(v, a[j-h])) { a[j] = a[j - h]; j -= h; } a[j] = v; }}
lajitellaan a[l]..a[r]
h-lajittelutaikasekvenssilleh:n arvoja
lisäyslajittelu, kunh=1
Kuorilajittelun h:n arvotKuorilajittelun h:n arvot
Mitä sekvenssiä käytetään? 1,4,13,40,121,… ei hullumpi, helppo laskea 1,3,7,21,48,112,… suunnilleen paras tunnettuAvoimia kysymyksiä: Onko olemassa parempia sekvenssejä? Keskimääräinen ajoaika O(N1+C) ? O(N lg N) ?
JakaumalajitteluJakaumalajittelu(distribution counting)(distribution counting)
Oletetaan tietueen avaimen olevan kokonaisluku [0,k]
Lasketaan kullekin avaimelle sitä pienempien avaimien lukumäärä. Tämän tiedon avulla avain saadaan oikeaan paikkaan.
Esim. jos on 17 x:ää pienempiä avaimia. x kuuluu paikkaan 18.
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4
0
a 1
1
3
2
4
3
3
4
0
b
1 2 3 4
2 3 4 51
lkm
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
0 0 0 0 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
lukumäärien alustaminen
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
0 0 0 lkm0
0 1 2 3 4
0 1 2 3 4lukumäärien laskenta
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
1
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
0 1 lkm0
0 1 2 3 4
0 1 2 3 4lukumäärien laskenta
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
1
2 3 4 51
0
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 lkm0
0 1 2 3 4
0 1 2 3 4lukumäärien laskenta
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
2 3 4 51
10
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 0 1 lkm0
0 1 2 3 4
0 1 2 3 4lukumäärien laskenta
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
2 3 4 51
2
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 0 2 2 lkm0
0 1 2 3 4
0 1 2 3 4lukumäärien laskenta
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 0 2 2 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 2 2 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
kumulatiivinen summa
2 3 4 51
0
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 2 2 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
kumulatiivinen summa
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 3 2 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
kumulatiivinen summa
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 3 5 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
kumulatiivinen summa
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 3 5 lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 4 5
4
lkm0
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
alkioiden lajittelu
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 1 4 5
41
lkm1
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
alkioiden lajittelu
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 2 4 5 lkm
41
1
3
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
alkioiden lajittelu
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 2 5 5 lkm
4
1
1 3 4
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
alkioiden lajittelu
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 3 5 5 lkm
4
1
1 3 43
0 1 2 3 4
0 1 2 3 4
Syöte: a[l]…a[r]Tulos: b[l]…b[r]Aputaulukko: lkm[0]…lkm[m], missä m isoin avain
alkioiden lajittelu
2 3 4 51
JakaumalajitteluJakaumalajittelu(distribution counting(distribution counting
4a 1 3 4 3
b
1 3 3 5
1 3 3 4 4
lkm1
0 1 2 3 4
0 1 2 3 4
2 3 4 51
JakaumalajitteluJakaumalajittelu
kuusi 0:aaneljä 1:täkaksi 2:taneljä 3:ta
lajiteltava taulukko
nolla avainta on 0:aa pienempiä,kuusi on 1:tä pienempiä, kymmenen on 2:ta pienempiä,12 on kolmosta pienempiä(keskimmäinen taulukko)
JakaumalajitteluJakaumalajittelu
void jakaumalajittelu(alkio a[], int l, int r) { int i, j, lkm[m]; int b[ARVO_MAX]; for(j = 0; j < m; j++) lkm[j] = 0; for(i = l; i <= r; i++) lkm[a[i] + 1]++; for(j = 1; j < m; j++) lkm[j] += lkm[j - 1]; for(i = l; i <= r; i++) b[lkm[a[i]]++] = a[i]; for(i = l; i <= r; i++) a[i] = b[i]; }
esiintymien lukumäärät
lukumäärien alustaminen
lukumäärien laskenta
kumulatiivinen summa
alkioiden lajittelu
lajitellun kopiointi
lajitellaan a[l]..a[r]
Jakaumalajittelun analyysiJakaumalajittelun analyysi
for(j = 0; j < m; j++) lkm[j] = 0;
for(i = l; i <= r; i++) lkm[a[i] + 1]++;
for(j = 1; j < m; j++) lkm[j] += lkm[j - 1];
for(i = l; i <= r; i++) b[lkm[a[i]]++] = a[i];
for(i = l; i <= r; i++) a[i] = b[i];
(m)
(m)
(n)
(n)
(r)
(m+n), n=r-l