kuplalajittelu (bubble sort)

32
Kuplalajittelu (bubble Kuplalajittelu (bubble sort) sort) Verrataan vierekkäisiä taulukon alkioita ja vaihdetaan niiden paikkaa tarvittaessa Jokaisella iteraatiolla pienin alkio lajittelemattomien joukosta ”kuplii” oikealle paikalleen lajiteltujen joukkoon

Upload: heaton

Post on 21-Jan-2016

53 views

Category:

Documents


0 download

DESCRIPTION

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 C-kielellä. - PowerPoint PPT Presentation

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