kuplalajittelu (bubble sort)

Post on 21-Jan-2016

53 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

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

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

top related