Kuplalajittelu (bubble sort)

Slides:



Advertisements
Samankaltaiset esitykset
Periaatteet ja muutamia käyttöohjeita Yhteystiedot: Paronintie Turenki Ehdoton.
Advertisements

18. Abstraktit tietotyypit
Tietorakenteet ja algoritmit
Venyttely ohjeet CLASSIC E-99.
LPC LPCC PLP LSP/LSF Matemaattinen kikka Levinson-Durbin algoritmi
Osaamisen ja sivistyksen parhaaksi Tilatiedot ja niiden muutokset
© Hannu Laine 1 Tietorakenteet ja algoritmit Funktio-osoittimet Funktio-osoittimen ja taulukko-osoittimen vertailu Funktio-osoittimen käyttötapoja.
Estimointi Laajennettu Kalman-suodin
Tietorakenteet ja algoritmit
2.8.3 Abstraktit tietotyypit
Taulukoiden määrittely, käsittely ja kopiointi Vaihtoehdot taulukoille
Rakenteinen ohjelmointi
ATK70d / Ohjelmointi 1 Kuplalajittelu © Helia / Jukka Harju, 2004.
Hypoteesin testeistä Testin valinta perustuu aina tutkimusongelmaan ja kuvailuun (joka perustuu mitta-asteikoihin) Testaus ei koskaan ole itsenäinen, vaan.
C-ohjelmointi, kevät 2006 Taulukot Binääritiedostot Luento
AS Automaation signaalinkäsittelymenetelmät
Tässä kerron ja näytän, mitä minä olen tehnyt ATK tunnilla 9lk:lla.
TMA.003 / L3 ( )1 3. Funktioista 3.1. Kuvaus ja funktio Olkoon A ja B ei-tyhjiä joukkoja. Tulojoukon A  B = {(x,y) | x  A, y  B} osajoukko on.
© Jukka Harju, Jukka Juslin Java-ohjelmointi Opas ammattimaiseen osaamiseen Luku 9 Poikkeuskäsittely.
Toiston tekeminen Javalla  Mikä toistorakenne on?  while toistorakenne  do-while toistorakenne  for toistorakenne 1.
TAULUKKO YKSIULOTTEINEN TAULUKKO. TAULUKKO  Taulukon tarkoitus Ohjelmassa tarvitaan paljon samantyyppisiä samaan kohdealueeseen kuuluvia muuttujia Näitä.
Binäärinen hakupuu Jokaisessa solmussa on yksikäsitteinen avain
Tiedon esittäminen.
Ohjelmistotekniikka - Tenttiin valmistautumisesta Kevät 2003 Hanna-Kaisa Lammi LTY/Tite.
Tiedonhakumenetelmät Helena Ahonen-Myka Kevät 2004, osa 9 Merkkijonohahmon etsintä selaamalla.
Digitaalinen kuvankäsittely
Tietoturvan perusteet - Syksy 2005 SSH salattu yhteys & autentikointi Tekijät: Antti Huhtala & Asko Ikävalko (TP02S)
ict1td002 - Copyright Raine Kauppinen 1 Alkuarvot ja tyyppimuunnokset (1/5)  Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int.
Miika Nurminen, Kerho -alusta() : void +lue_tiedostosta(tied : String) : String +talleta() : String +kerhon_nimi(): String +jasenia() : int +poista(nro:
1. Joukko-oppi Merkinnät
Metodit – Arvotyyppi Ellei metodi palauta arvoa, sen arvotyyppi on void Tällöin ”return;”-lauseke ei ole metodissa pakollinen, vaikka sen käyttö on sallittua.
11. Javan toistorakenteet
XNA peliohjelmointi. XNA Perustuu Microsoftin kehittämään.NET- arkkitehtuuriin ja C#-kieleen. XNA:lla tehdyt pelit toimivat Windows ja XBOX360-alustoilla.
Professori Pekka Kauppi, Bio- ja ympäristötieteiden laitos, HY: Miksi yliopistotutkija tallentaa julkaisuarkistoon? JULKAISIJAN ILTAPÄIVÄ 2007 Julkaisuarkistojen.
@ Leena Lahtinen OHJELMAN OSITTAMINEN LUOKKA ATTRIBUUTIT METODIT.
3.2 Kompleksisuus Vain pieni osa kaikista tehtävistä on laskettavissa tai edes osittainkaan laskettavissa. Laskettavien osalta saattaa olla tarpeellista.
@ Leena Lahtinen TIETOKONEOHJELMAN RAKENNE OHJELMALLA ON KAKSI OSAA:  MÄÄRITYSOSA TIETOJEN KUVAUKSIA VARTEN  SUORITUSOSA TIETOJEN KÄSITTELYÄ.
Aakkosnumeerinen tieto Tarkoittaa kaikkea muuta tietoa paitsi laskentaan tarkoitettuja lukuja Muuttujan tietosisältö on siis tekstitietoa Muuttujan tietotyypiksi.
Visual Basic -ohjelmointi
Olioiden taulukointi Perustaulukon käyttö Luokan ilmentymät voidaan tallettaa taulukkoon samoin kuin muuttujat Esimerkki talletetaan taulukkoon opintojaksojen.
S ysteemianalyysin Laboratorio Teknillinen korkeakoulu Esitelmä 2 - Jirka Poropudas Optimointiopin seminaari - Kevät 2005 / 1 Bayes-verkoista s
Funktio.
Keskusmuistitietokantahakemistot Vilho Raatikka Solid Information Technology Tietokannat NYT! Helsinki,
S ysteemianalyysin Laboratorio Teknillinen korkeakoulu Esitelmä 13 – Tommi Nykopp Optimointiopin seminaari - Syksy 2005 / 1 Päätösteoreettinen vianhaku.
15. Ohjelmoinnin tekniikkaa
POTENSSIT eksponentti kantaluku a n = a ·a · · · ·a n kpl E.1. E = 3 · 3 · 3 · 3 = 81 Huom. Miljoona = 10 6 Miljardi = 10 9 Biljoona = Triljoona.
Foreach-toistolausetMyn1 foreach-toistolause foreach-rakenteella on kätevä käydä läpi kaikki taulukon alkiot. Erityisen kätevää se on hajautustaulukon.
Lajittelu: peruskäsitteet
Prioriteettijonot ja kekolajittelu (heapsort)
Puun määritelmä Puu on yhden tai useamman kytketyn solmun muodostama hierarkinen joukko Lehtisolmuista juurisolmuun on yksikäsitteinen polku Käytetään.
Jakolajittelu (Radix sort) Vertailu tehdään avaimen osien perusteella Avaimia käsitellään R-kantaisina arvoina esim. postin lajittelukone prosessoi lähetykset.
Lajittelun sovelluksia Yksilöllisyyden testaaminen Kopioiden poistaminen Mediaani/n:ksi suurimman valinta frekvenssien laskenta/yleisin alkio, l.moodi.
Hajoita ja hallitse (divide and conquer) Pikalajittele n-alkioinen taulukko 1. Divide: Jaetaan taulukko kahdeksi alitaulukoksi tukialkion (pivot) x suhteen:
Kompleksisuus. Algoritmien analyysissä tutkitaan algoritmien käyttämän (tietokone)ajoajan ja muistin määrän riippuvuutta syöttöaineiston koosta (N). Syöttöaineisto.
Hajakoodaus Talletetaan alkiot avain-indeksoituun taulukkoon Hajakoodausfunktio Menetelmä avain-indeksin laskemiseen avaimesta Törmäyksen selvitysstrategia.
Merkkijono Sekvenssi merkkejä aakkostosta: - binäärinen {0, 1} -ASCII, UNICODE Sovelluksia: - Tekstinkäsittely - Digitaalinen kirjasto - Laskennallinen.
Muuttujan osoite int a=1; 0xbfffea64 /* tulostetaan a:n osoite*/ printf(“%p\n”, &a); 0xbfffea68 /* tulostetaan a:n osoite + 1*/ printf(“%p\n”, &a+1); /*
Symbolitaulut Joukko hakuavaimen omaavia tietueita LISÄÄ uusi tietue ETSI tietue hakuavaimen perusteella Sovelluksia: Spell checker etsii sanoja sanakirjasta.
Jenna Nyblom Katri Vanhatalo Oskari Anttalainen
Scalan valmiit kokoelmat. Mikä on kokoelma?  Tietorakenne jonka tehtävänä on pitää kirjaa (useista) tietyn tyyppisistä arvoista. Kokoelman sisältämiä.
Kartturin työkalut. Ennakkotutustuminen eli nuotittaminen: kilpailua edeltävällä viikolla jokaisen erikoiskokeen saa ajaa kaksi kertaa läpi vakioautolla.
KORKEA-ASTEEN VALINTAPERUSTEISTA Muutama esimerkki.
Matematiikkaa 3 a Kertausjakso – Laskuja MATEMATIIKKAA 3A, KERTAUSJAKSO LASKUJA © VARGA–NEMÉNYI RY 2016.
Siirtorekisterin toteutus Javalla
13. Loogiset operaatiot.
Foreach-toistolause foreach-rakenteella on kätevä käydä läpi kaikki taulukon alkiot. Erityisen kätevää se on hajautustaulukon tapauksessa, jossa taulukon.
Muuttujamuunnoksista
ATK70d / Ohjelmointi 1 Kuplalajittelu © Helia / Jukka Harju, 2004.
Suodattaminen Valitse suodatustapa Anna hakukriteeri(t) Katso tulos
Production line simulation model
Esityksen transkriptio:

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ä lajitellaan a[l]..a[r] 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]); } Käydään kaikki alkiot läpi

Kuplalajittelun 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) 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, sitten 4-lajittelu A S O R T I N G E X A M P L E A E O R T I N G E X A M P L S A E N R T I O G E X A M P L S A E N G T I O R E X A M P L S A E N G E I O R T X A M P L S A E A G E I N R T X O M P L S A E A G E I N M T X O R P L S A E A G E I N M P X O R T L S A E A G E I N M P L O R T X S

1-lajitellaan, 4-lajiteltu tiedosto A I A G E L E M P S N R T X O A A I G E L E M P S N R T X O A A E G I L E M P S N R T X O A A E E G I L M P S N R T X O A A E E G I L M N P S R T X O A A E E G I L M N P R S T X O A A E E G I L M N O P R S T X

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-lajittelu taikasekvenssille h:n arvoja lisäyslajittelu, kun h=1

Kuorilajittelun 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 tunnettu Avoimia kysymyksiä: Onko olemassa parempia sekvenssejä? Keskimääräinen ajoaika O(N1+C) ? O(N lg N) ?

Jakaumalajittelu (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.

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a lkm 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a lkm lukumäärien alustaminen 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 lkm lukumäärien laskenta 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 lkm lukumäärien laskenta 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 1 lkm lukumäärien laskenta 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 2 lkm lukumäärien laskenta 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 2 2 lkm lukumäärien laskenta 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 2 2 lkm 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 2 2 lkm kumulatiivinen summa 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 2 2 lkm kumulatiivinen summa 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 3 2 lkm kumulatiivinen summa 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 3 5 lkm kumulatiivinen summa 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 3 5 lkm 1 2 3 4 b Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 4 5 lkm alkioiden lajittelu 1 2 3 4 b 4 Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 1 4 5 lkm alkioiden lajittelu 1 2 3 4 b 1 4 Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 2 4 5 lkm alkioiden lajittelu 1 2 3 4 b 1 3 4 Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 2 5 5 lkm alkioiden lajittelu 1 2 3 4 b 1 3 4 4 Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 3 5 5 lkm alkioiden lajittelu 1 2 3 4 b 1 3 3 4 4 Syöte: a[l]…a[r] Tulos: b[l]…b[r] Aputaulukko: lkm[0]…lkm[m], missä m isoin avain

Jakaumalajittelu (distribution counting 1 2 3 4 1 2 3 4 5 4 1 3 4 3 a 1 1 3 3 5 lkm 1 2 3 4 b 1 3 3 4 4

Jakaumalajittelu lajiteltava nolla avainta on taulukko 0:aa pienempiä, kuusi on 1:tä pienempiä, kymmenen on 2:ta pienempiä, 12 on kolmosta pienempiä (keskimmäinen taulukko) kuusi 0:aa neljä 1:tä kaksi 2:ta neljä 3:ta

Jakaumalajittelu void jakaumalajittelu(alkio a[], int l, int r) { lajitellaan a[l]..a[r] 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

Jakaumalajittelun 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]; (n) (m) (n) (r) (m+n), n=r-l