Transcript
Page 1: Kuplalajittelu (bubble sort)

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

Page 2: Kuplalajittelu (bubble sort)

Kuplalajittelu (bubble sort)Kuplalajittelu (bubble sort)

Page 3: 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

Page 4: Kuplalajittelu (bubble sort)

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

Page 5: Kuplalajittelu (bubble sort)

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

Page 6: Kuplalajittelu (bubble sort)

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

Page 7: Kuplalajittelu (bubble sort)

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

Page 8: Kuplalajittelu (bubble sort)

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

Page 9: Kuplalajittelu (bubble sort)

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) ?

Page 10: Kuplalajittelu (bubble sort)

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.

Page 11: Kuplalajittelu (bubble sort)

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

Page 12: Kuplalajittelu (bubble sort)

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

Page 13: Kuplalajittelu (bubble sort)

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

Page 14: Kuplalajittelu (bubble sort)

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

Page 15: Kuplalajittelu (bubble sort)

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

Page 16: Kuplalajittelu (bubble sort)

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

Page 17: Kuplalajittelu (bubble sort)

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

Page 18: Kuplalajittelu (bubble sort)

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

Page 19: Kuplalajittelu (bubble sort)

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

Page 20: Kuplalajittelu (bubble sort)

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

Page 21: Kuplalajittelu (bubble sort)

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

Page 22: Kuplalajittelu (bubble sort)

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

Page 23: Kuplalajittelu (bubble sort)

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

Page 24: Kuplalajittelu (bubble sort)

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

Page 25: Kuplalajittelu (bubble sort)

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

Page 26: Kuplalajittelu (bubble sort)

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

Page 27: Kuplalajittelu (bubble sort)

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

Page 28: Kuplalajittelu (bubble sort)

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

Page 29: Kuplalajittelu (bubble sort)

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

Page 30: Kuplalajittelu (bubble sort)

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)

Page 31: Kuplalajittelu (bubble sort)

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]

Page 32: Kuplalajittelu (bubble sort)

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


Top Related