Quicksort. Fra idé til algoritme.

Like dokumenter
Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

En implementasjon av binærtre. Dagens tema. Klassestruktur hovedstruktur abstract class BTnode {}

INF1010 notat: Binærsøking og quicksort

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

alternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater

Logaritmiske sorteringsalgoritmer

Rekursjon. Binærsøk. Hanois tårn.

INF1010 Sortering. Marit Nybakken 1. mars 2004

Algoritmer og datastrukturer Løsningsforslag

Løsnings forslag i java In115, Våren 1999

Oppgave 1 a. INF1020 Algoritmer og datastrukturer. Oppgave 1 b

Hvor raskt klarer vi å sortere?

INF2220: Time 12 - Sortering

Løsnings forslag i java In115, Våren 1996

Løsnings forslag i java In115, Våren 1998

Først litt praktisk info. Sorteringsmetoder. Nordisk mesterskap i programmering (NCPC) Agenda

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Sortering med tråder - Quicksort

Ny/utsatt EKSAMEN. Dato: 5. januar 2018 Eksamenstid: 09:00 13:00

UNIVERSITETET I OSLO

NITH PG4200 Algoritmer og datastrukturer Løsningsforslag Eksamen 4.juni 2013

Algoritmer og Datastrukturer

8NH )RUHOHVQLQJ 'HSDUWPHQWÃRIÃ,QIRUPDWLFVÃ8QLYHUVLW\ÃRIÃ2VORÃ1RUZD\,1) ± $OJRULWKPVÃÉÃ'DWDÃ6WUXFWXUHV

Lenkelister. Lister og køer. Kopi av utvalgte sider fra forelesningen.

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Kap.8 Sortering og søking sist oppdatert 16.03

Norsk informatikkolympiade runde

Quicksort. Lars Vidar Magnusson Kapittel 7 Quicksort Randomisert Quicksort Analyse av Quicksort

Øvingsforelesning 3: Splitt og hersk. Daniel Solberg

Algoritmer og datastrukturer Eksamen

Kapittel 12: Rekursjon

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

UNIVERSITETET I OSLO

Rekursjon. Hanois tårn. Milepeler for å løse problemet

INF2220: Forelesning 7. Kombinatorisk søking

Algoritmer og datastrukturer Løsningsforslag

UNIVERSITETET I OSLO

Algoritmer og Datastrukturer

Løsningsforslag til eksamen i fag SIF8010 Algoritmer og Datastrukturer Tirsdag 14. Desember 1999, kl

UNIVERSITETET I OSLO

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

Prøveeksamen INF2440 v Arne Maus PSE, Inst. for informatikk

Faglig sosial ettermiddag. Løsningsforslag Eksamen INF1010 Høsten 2006

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

Algoritmer og datastrukturer Løsningsforslag

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

En algoritme for permutasjonsgenerering

Obligatorisk oppgave 1 INF1020 h2005

Øvingsforelesning 6. Sorteringsalgoritmer. Kristian Veøy

Algoritmer og Datastrukturer

EKSAMEN med løsningsforslag

Repetisjon. INF gruppe 13

Løsningsforslag 2017 eksamen

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

EKSAMEN. Emne: Algoritmer og datastrukturer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Studieaktiviteter i INF1010

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.8

Algoritmer og datastrukturer Kapittel 1 - Delkapittel 1.3

Dagens tema INF1010 INF1010 INF1010 INF1010

Oppgave 1. INF1000 Uke 13. Oppgave 2. Oppgave 3. Er dette lovlige deklarasjoner (når de foretas inni en metode)? JA NEI

Dagens forelesning. INF1010 Datastrukturer Lister og køer Pekerkjedelister Øvelser. Innhold i dette lysarksettet

UNIVERSITETET I OSLO

Oppgave 3 a. Antagelser i oppgaveteksten. INF1020 Algoritmer og datastrukturer. Oppgave 3. Eksempelgraf

Løsningsforslag til eksamen i INF1000 våren 2006

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

7) Radix-sortering sekvensielt kode og effekten av cache

Forelesning inf Java 4

INF 1000 Prøveeksamen. 23. november Ole Christian og Arne. Oppgave 1 (10 poeng) Er disse programsetningene lovlige i Java? Oppgave 2 (10 poeng)

Programmering Høst 2017

UNIVERSITETET I OSLO

Oppgave 1 LØSNINGSFORSLAG. Eksamen i INF desember Betrakt følgende vektede, urettede graf:

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Kapittel 8: Sortering og søking

Oppgave 1. Oppgave 2. Høgskolen i Østfold Avdeling for informasjonsteknologi

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

INF1010. Sekvensgenerering Alle mulige sekvenser av lengde tre av tallene 0, 1 og 2: Sekvensgenerering. Generalisering. n n n! INF1010 INF1010 INF1010

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

løsningsforslag-uke5.txt

HØGSKOLEN I BERGEN Avdeling for ingeniørutdanning

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Forelesning inf Java 5

Forelesning inf Java 5

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»

Kapittel 9: Sortering og søking Kort versjon

Oppgave 1 a. INF2220 Algoritmer og datastrukturer. Oppgave 1 b

Oppgavesettet består av 7 sider, inkludert denne forsiden. Kontroll& at oppgaven er komplett før du begynner å besvare spørsmålene.

Ordliste. Obligatorisk oppgave 1 - Inf 1020

Norsk informatikkolympiade runde

INF1000 Behandling av tekster

Transkript:

Quicksort Fra idé til algoritme.

Quicksortalgoritme algoritmeidé 1. Del arrayen i to deler, slik at alle elementer i den ene delen er mindre enn alle elementer i den andre delen. Q U I C K S O R T A L G O R I T M E N E M I C K I G L A N R O O R S T U Q T michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 2

2. Velg en verdi som finnes i arrayen og bytt to og to elementer ved å starte fra de to endene slik at den ene delen inneholder verdiene som er mindre enn den valgte verdien, den andre delen inneholder verdiene som er større. Q U I C K S O R T A L G O R I T M E N michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 3

E M I C K I G L A N R O O R S T U Q T 3. Vi har da tre deler, først en del med elementer mindre enn eller lik den valgte verdi, så ett element med den valgte verdi, til slutt en del med elementer større enn eller lik den valgte verdi. Gjenta 1 3 på de to delene. Hvis de to delene blir sortert, vil da hele arrayen være sortert. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 4

E M I C K I G L A N R O O R S T U Q T pivot = a [ t i l ] ; boolean ikkeferdig = true ; int i = fra ; int j = t i l 1; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 5

A C E G I I K L M N R O O R S T U Q T while ( ikkeferdig ) { while ( a [ i ] < pivot ) { i++ ; while ( a [ j ] > pivot ) { j ; i f ( i < j ) { bytt ( a, i, j ) ; i ++; j ; else ikkeferdig = false ; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 6

Ved å sørge for at begge delarrayer er kortere enn den vi har er vi sikret at de rekursive kallene går mot basistilfellet. Basistilfellet er en array av lengde mindre enn 4. Disse små delarrayene sorteres direkte når de er av lengde 2 eller 3. (Delarrayer av lengde 1 eller 0 er sortert). Vi videreutvikler algoritmen: michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 7

1. Hvis antall elementer som skal sorteres er 0 eller 1, returner. 2. Hvis antall elementer som skal sorteres er 2 eller 3, sorter dem uten rekursive kall og returner. 3. Plukk et («middels stort») element fra mengden som skal sorteres. Dette kalles pivot-elementet. 4. Del resten av elementene i to: De som er mindre enn pivot-elementet. De som er større enn pivot-elementet. 5. Sorter disse delmengdene hver for seg (ved hjelp av quicksort). 6. Returner sorteringen av de små elementene, etterfulgt av pivot-elementet, etterfulgt av sorteringen av de store elementene. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 8

Algoritmevalg For små arrayer med N 20 er quicksort mindre effektiv enn f.eks. innstikksortering. På grunn av de rekursive kallene vil dette være et vanlig tilfelle! Løsning: Bruk en avskjæring mellom 5 og 20 (vanligvis 10) slik at arraysegmenter mindre enn dette sorteres ved hjelp av en annen sorteringsmetode. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 9

Partisjoneringsstrategi Hvordan dele arrayen i en «liten» og en «stor» del? 1. Få pivot-elementet «vekk» ved å bytte det med det siste elementet. 2. La i starte på det første elementet, og j på det nest-siste. 3. Så lenge i er til venstre for j: 3.1 Flytt i mot høyre så lenge elementet i peker på er mindre enn pivot-elementet. 3.2 Flytt j mot venstre så lenge a[j] er større enn pivot-elementet. 3.3 i peker nå på et «stort» element og j på et «lite». Hvis i er til venstre for j, byttes disse elementene. 4. Bytt pivot-elementet med elementet i posisjon i. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 10

Partisjoneringsstrategi utprogrammert boolean ikkeferdig = true ; int i = fra ; int j = t i l 1; while ( ikkeferdig ) { while ( a [ i ] < pivot ) { i++ ; while ( a [ j ] > pivot ) { j ; i f ( i < j ) { bytt ( a, i, j ) ; i ++; j ; else ikkeferdig = false ; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 11

Hvordan velge pivot-element? Ideelt: Et pivot-element som deler mengden i to like store halvdeler. Best?: Velger pivot-elementet så «tilfeldig» som mulig. I algoritmen nedenfor er siste element valgt som pivot-element. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 12

void quicksort ( char [ ] a, int fra, int t i l ) { // rekursjonsbunn hvis mindre enn 4 elementer i f ( t i l fra < 3 ) { // sortering utelatt else { // minst 4 elementer char pivot = a [ t i l ] ; // Partisjonerer arrayen ( se over ) // Flytter pivot elementet t i l midten bytt ( a, i, t i l ) ; // Alle elementer : a[ fra, i 1] <= a[ i ] <= a[ i +1, t i l ] quicksort ( a, fra, i 1); // a[ fra, i ] er sortert, alle <= a[ i +1, t i l ] quicksort ( a, i +1, t i l ) ; // a[ fra, t i l ] er sortert michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 13

Programmet effektiviseres best ved å sikre valg av et pivot-element så nær medianen (midterste verdi når sortert) som mulig. I algoritmen nedenfor bruker vi midten-av-tre partisjonering: Se på det første, midterste og siste elementet. Velg det mellomste av disse som pivot. OBS! Metoden vil også sortere disse tre elementene, samt skjule pivot-elementet. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 14

midtenavtre() i Java char midtenavtre ( char [ ] a, int fra, int t i l ) { int midten = ( fra + t i l ) / 2; i f ( a [ midten ] < a [ fra ] ) { bytt ( a, fra, midten ) ; i f ( a [ t i l ] < a [ fra ] ) { bytt ( a, fra, t i l ) ; i f ( a [ t i l ] < a [ midten ] ) { bytt ( a, midten, t i l ) ; // Skjul pivot elementet nest lengst t i l høyre bytt ( a, midten, t i l 1); return a [ t i l 1]; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 15

Quicksort med midten-av-tre-partisjonering void quicksort ( char [ ] a, int fra, int t i l ) { /* Hvis fra er nær t i l, sorter direkte /* og returner ( b a s i s t i l f e l l e t ). Hvis ikke : */ int pivotindeks ; char pivot = midtenavtre ( a, fra, t i l ) ; int i = fra ; int j = t i l 1; while ( true ) { while ( a[++ i ] < pivot ) { while ( a[ j ] > pivot ) { i f ( i < j ) bytt ( a, i, j ) ; else break ; pivotindeks = i ; bytt ( a, pivotindeks, t i l 1); quicksort ( a, fra, pivotindeks 1); quicksort ( a, pivotindeks+1, t i l ) ; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 16

A C E G I I K L M N R O O R S T U Q T while ( ikkeferdig ) { while ( a [ i ] < pivot ) { i++ ; while ( a [ j ] > pivot ) { j ; i f ( i < j ) { bytt ( a, i, j ) ; i ++; j ; else ikkeferdig = false ; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 17

A C E G I I K L M N O O Q R R S T T U while ( ikkeferdig ) { while ( a [ i ] < pivot ) { i++ ; while ( a [ j ] > pivot ) { j ; i f ( i < j ) { bytt ( a, i, j ) ; i ++; j ; else ikkeferdig = false ; michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 18

Oppgaver til neste fellesøvelse 1. Skriv en metode som sorterer 2 elementer 2. Skriv en metode som sorterer 3 elementer 3. Hvorfor kan vi under partisjoneringen ikke hoppe over elementer som er lik pivotelementet? (De ligger jo i utgangspunktet ikke «feil»). 4. Skriv om partisjoneringen slik at elementer lik pivotelementet ikke blir flyttet. 5. Vis at algoritmen skissert over (ikke den som bruker midten-av-tre) faktisk fungerer for delarrayer med lengde mindre enn 4 også. michael@ifi.uio.no INF1010 29. april 2010 (uke 17) 19