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

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

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

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

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

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

Quicksort. Fra idé til algoritme.

INF1010 notat: Binærsøking og quicksort

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

Dagens tema INF1010 INF1010 INF1010 INF1010

Eks 1: Binærtre Binærtretraversering Eks 2: Binærtre og stakk

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

Gjøre noe i hele treet = kalle på samme metode i alle objekten. Java datastruktur Klassestruktur

UNIVERSITETET I OSLO

INF1010 Binære søketrær ++

Vanlige datastrukturer. I dette lysarksettet

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

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

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

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

INF1010. Om pensum INF1010 INF1010 INF1010 INF1010. Det vesentlige er å forstå og kunne lage programmer ved hjelp av eksemplene i bøkene.

Studieaktiviteter i INF1010

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

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

Algoritmer og datastrukturer Eksamen

UNIVERSITETET I OSLO

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

Algoritmer og datastrukturer Løsningsforslag

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

UNIVERSITETET I OSLO

INF1010 LISTER. Listeelementer og listeoperasjoner. Foran. Bak

Sortering med tråder - Quicksort

INF1010 siste begreper før oblig 2

Kapittel 9: Sortering og søking Kort versjon

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

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

Algoritmer og Datastrukturer

UNIVERSITETET I OSLO

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

EKSAMEN med løsningsforslag

INF1010. Rekursjon En rekursiv definisjon av rekursjon, slik det kunne stå i en ordbok: Introduksjon til Rekursiv programmering

Lenkelister. Lister og køer.

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

INF1010 Sortering. Marit Nybakken 1. mars 2004

Kapittel 8: Sortering og søking

UNIVERSITETET I OSLO

INF1010 e-postadresser

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

UNIVERSITETET I OSLO

Operasjoner på lenkede lister (enkeltlenket) Eksempel på en lenket liste: personliste. INF januar 2010 (uke 3) 2

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer

INF2220: Time 12 - Sortering

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Løsningsforslag

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Velkommen til INF1010

Ny/utsatt EKSAMEN. Dato: 6. januar 2017 Eksamenstid: 09:00 13:00

Kapittel 9: Sortering og søking Kort versjon

Løsningsforslag ukeoppg. 9: okt (INF Høst 2011)

UNIVERSITETET I OSLO

INF1010. Grensesnittet Comparable<T>

UNIVERSITETET I OSLO

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

Logaritmiske sorteringsalgoritmer

EKSAMEN. Algoritmer og datastrukturer

Dagens tema. INF Algoritmer og datastrukturer. Binærtrær. Generelle trær

Kapittel 12: Rekursjon

UNIVERSITETET I OSLO

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

INF1010 våren januar. Objektorientering i Java

Kap.8 Sortering og søking sist oppdatert 16.03

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

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

Hvor raskt klarer vi å sortere?

Kapittel 8: Sortering og søking INF100

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

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

Rekursjon som programmeringsteknikk

Kapittel 9: Sortering og søking Kort versjon

INF Notater. Veronika Heimsbakk 10. juni 2012

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

Algoritmer og datastrukturer Kapittel 3 - Delkapittel 3.1

Binære trær: Noen algoritmer og anvendelser

Kapittel 8: Sortering og søking INF100

IN1010 våren januar. Objektorientering i Java

Algoritmer og datastrukturer Løsningsforslag

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

Kapittel 9: Sortering og søking Kort versjon

2 Om statiske variable/konstanter og statiske metoder.

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Algoritmer og Datastrukturer

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

INF1010 Rekursjon. Marit Nybakken 1. mars 2004

Transkript:

En implementasjon av binærtre Dagens tema Eksempel på binærtreimplementasjon Rekursjon: Tårnet i Hanoi Søking Lineær søking Klassestruktur hovedstruktur abstract class { class Person extends { class Binaertre { rot; public void settinn( btn) { public void skrivut() { Rekursjon: Binærsøk class BinærTreEksmpl{... main()... Sortering Innstikksortering Rekursjon: Quicksort Dette er et sett lysark for en forelesning. Mange sider er ukommentert og ufullstendige. Mange spørsmål er ubesvarte og det kan forekomme feil. Settet er tildels uegnet til selvstudium uten notater fra forelesningen. foran etter Et objekt av klassen Person "Susanna" Stein Michael Storleer 24. april 2007 Ark 1 av 32 Stein Michael Storleer 24. april 2007 Ark 2 av 32 Klassestruktur med mer detaljer abstract class { foran, etter; abstract int sammenlign( btn); void settinnherellerunder( inn){ void skrivutrekursivt() { Gunnar null Nikita null class Person extends { ; int sammenlign( btn){ class Binærtre { rot; public void settinn( btn) { public void skrivut() { class BinærTreEksmpl{ public static void main( [] args ) { Binærtre tre = new Binærtre(); <sett inn personer og skriv ut> Jørgen rot settinn( btn) skrivut() Henrik main() Binærtre tre Et objekt av klassen BinærTreSubkl Susanne Binærtreet som har 5 objekter er her tegnet oppover. I programmerings skisser tegner vi vanligvis (binære) trær nedover. Et datastrukturdiagram etter at personen med = "Nikita" er satt inn. Stein Michael Storleer 24. april 2007 Ark 3 av 32 Stein Michael Storleer 24. april 2007 Ark 4 av 32

class Binærtre og class BinærTreEksmpl class Binærtre { rot; public void settinn( btn) { if (rot == null) rot = btn; else rot.settinnherellerunder(btn); public void skrivut() {rot.skrivutrekursivt(); class BinærTreEksmpl{ public static void main( [] args ) { Binærtre tre = new Binærtre(); tre.settinn(new Person("Henrik"));... tre.skrivut(); Metoden sammenlign() for å rangere to personer alfabetisk abstract class { foran, etter; abstract int sammenlign( btn); class Person extends { ; Person( s){ = s; int sammenlign( btn){ return.comparetoignorecase(((person)btn).); Legg merke til hvordan sammenligningsmetoden (Den innebygde heter CompareTo) er programmert. Ved å lage den selv bestemmer vi hvordan den virker, forutsatt at vi kjenner metoden comparetoignorecase i klassen. Stein Michael Storleer 24. april 2007 Ark 5 av 32 Stein Michael Storleer 24. april 2007 Ark 6 av 32 I : metoden skrivutrekursivt (infix) void skrivutrekursivt() { if (foran!= null) foran.skrivutrekursivt(); //a System.out.println(((Person)this).); //b if (etter!= null) etter.skrivutrekursivt(); //c Rekkefølge: prefix void skrivutrekursivt() { System.out.println(((Person)this).); //b if (foran!= null) foran.skrivutrekursivt(); //a if (etter!= null) etter.skrivutrekursivt(); //c Rekkefølge: postfix void skrivutrekursivt() { if (foran!= null) foran.skrivutrekursivt(); //a if (etter!= null) etter.skrivutrekursivt(); //c System.out.println(((Person)this).); //b I : metoden settinnherellerunder void settinnherellerunder( inn){ int smnlgn = sammenlign(inn); if ( smnlgn < 0 ) { if (etter == null) etter = inn; else etter.settinnherellerunder(inn); else if ( smnlgn > 0 ) { if (foran == null) foran = inn; else foran.settinnherellerunder(inn); Metoden utføres inne i et objekt. Attributtene referer til dette objektets pekervariable og metoder. Merk at treet vi setter inn i ikke er parameter, men at vi har adgang til pekerne i objektet. Sjekk rekursjonskriteriene. Stein Michael Storleer 24. april 2007 Ark 7 av 32 Stein Michael Storleer 24. april 2007 Ark 8 av 32

Person interface TreElement Abstraksjon: grensesnitt Klassestruktur som gjør at vi kan sette objekter av forskjellige klasser inn i samme tre så lenge de implementerer det tilhørende grenesenitt som gjør at de spiller rollen treelement: Barn Voksen Pattedyr Menneske By Grensesnittet har bare metoder som kan manipulere (lese og sette) pekerne til TreElement. Pekerne og metodene må implementeres i klassene som bruker (implements) TreElement. interface TreElement { TreElement hentteforan(); TreElement hentteetter(); void settteforan(treelement te); void settteetter(treelement te); class Person{... class Barn extends Person implements TreElement { TreElement foran, etter; TreElement hentteforan(); TreElement hentteetter(); void settteforan(treelement te); void settteetter(treelement te); Klassediagram av programskissen på forrige ark. Datastrukturdiagram TreElement rot Objekter av klasser (og deres sub klasser) som implementerer grense snittet TreElement kan inngå i samme binærtrestruktur. Disse objektene kan pekes på av variable av typen TreElement. class Voksen extends Person implements TreElement {... class Pattedyr implements TreElement {... class Menneske extends Pattedyr {... class By implements TreElement {...... Stein Michael Storleer 24. april 2007 Ark 9 av 32 Stein Michael Storleer 24. april 2007 Ark 10 av 32 Hanois tårn Tårnet i Hanoi eller Hanois tårn Legenden Hindutempel med 3 påler, 64 gullplater med hull i midten Når alle 64 plater er flyttet til en annen påle vil templet og verden gå under Illustrasjonen er hentet fra www.wikipedia.org Spilleregler Bare en plate kan flyttes om gangen Minst 18.446.744.073.709.551.615 enkeltflyttinger Edouard Lucas 1883 Spillet Platen som flyttes må flyttes til en av de andre pinnene Det finnes flere algoritmer En plate kan ikke legges over en mindre plate Stein Michael Storleer 24. april 2007 Ark 11 av 32 Stein Michael Storleer 24. april 2007 Ark 12 av 32

I kvasijavakode: Algoritmer som løser Hanois tårn med n plater Ikke rekursiv algoritme Definerer en positiv retning: while (!ferdig ) { 1. Flytt den minste platen en pinne i postiv retning 2. Hvis mulig, gjør det lovlige trekket mellom de to andre pinnene (ikke pinnen med den minste platen) Hvis trekk 2 ikke var mulig { ferdig = true P1 P2 P3 P1 hvis antall plater er et ulikt tall P1 P3 P2 P1 hvis antall plater er et partall Algoritme: Gå i løkke: 1. Flytt den minste platen en pinne i postiv retning 2. Gjør det eneste andre trekket som ikke involverer den minste platen Avslutt løkka hvis 2 ikke var mulig, hvis 2 kunne gjøres, fortsett slutt Det er lett å lage en datamodell og et javprogram som utfører algoritmen. Det er vanskelig å skjønne at dette programmet løser Hanois tårn med n plater. (Beviset for det går langt utover det vi skal lære i. Interesserte kan finne bevis på nettet, f.eks. http://www.cs.yorku.ca/ andy/courses/3101/lecture notes/ln0.html) Stein Michael Storleer 24. april 2007 Ark 13 av 32 Stein Michael Storleer 24. april 2007 Ark 14 av 32 Rekursiv algoritme Først skriver vi et program som løser det legendariske problemet med 64 plater. Istedet for en rekursiv metode lager vi først 64 metoder som kan kalle hverandre. (Nesten rekursjon). Programmeringside Lage en metode som kan flytte 64 plater ved hjelp av to andre metoder ❶ en metode som kan flytte en plate ❷ en metode som kan flytte 63 plater: Hvis flytt63 gjør det den skal vil dette virke. Vi må da programmere flytt63, og gjør det over samme lest: public static void flytt63 (int fra, int til, int via) { flytt62(fra, via, til); flytt62(via, til, fra); public static void flytt64 (int fra, int til, int via) { flytt63(fra, via, til); flytt63(via, til, fra); Vi skjønner mønsteret (vi trenger flytt62, flytt61,..., flytt2 også) og hvis vi behersker en teksteditor godt, bruker vi ikke lang tid på å lage programmet: public static void flytt1(int fra, int til, int via) { System.out.println( Flytter en plate fra: + fra + til: + til); public static void flytt63 (int fra, int til, int via) {... Stein Michael Storleer 24. april 2007 Ark 15 av 32 Stein Michael Storleer 24. april 2007 Ark 16 av 32

public static void flytt64 (int fra, int til, int via) { flytt63(fra, via, til); flytt63(via, til, fra); public static void flytt63 (int fra, int til, int via) { flytt62(fra, via, til); flytt62(via, til, fra); // 60 metoder utelatt (flytt62...tilogmed... flytt3)) public static void flytt2 (int fra, int til, int via) { flytt1(fra, via, til); flytt1(via, til, fra); public static void flytt1(int fra, int til, int via) { System.out.println( Flytter en plate fra: + fra + til: + til); top down programutvikling Denne måten å utvikle programmet på (vi bruker metoder vi ikke har programmert ennå) kalles top down, siden vi begynner i den komplekse enden (løser problemet for 64 plater og antar vi har metoder som løser de enklere oppgavene før vi har laget dem). lag først en metode som kan flytte 64 plater (vha flytt63) så en som kan flytte 63 ved hjelp av den som kan flytte 62 så en som kan flytte 62...... så en som kan flytte 2 ved hjelp av en som kan flytte 1 tilslutt den som flytter 1 plate Stein Michael Storleer 24. april 2007 Ark 17 av 32 Stein Michael Storleer 24. april 2007 Ark 18 av 32 bottom up programutvikling Vi kan også tenke omvendt. Den utviklingsmetoden kalles bottom up: lag først en metode som kan flytte 1 plate ved hjelp av den lager vi metoden som kan flytte 2 så en som kan flytte 3 ved hjelp av mtoden som flytter 2... så en som kan flytte 63 ved hjelp av den som kan flytte 62 tilslutt en som kan flytte 64 Mens vi har laget 64 nesten like metoder, har vi fått ideen om å la antall plater som skal flyttes være en parameter til metoden, la oss kalle antallet n, og de tre pinnene henholdsvis frapinnen, tilpinnen og viapinnen: ❶ flytt n 1 plater fra frapinnen til viapinnen ❷ flytt 1 plate fra frapinnen til tilpinnen ❸ flytt n 1 plater fra viapinnen til tilpinnen Hvis algoritmen klarer å flytte n 1 plater riktig, skulle dette fungere for n plater (vi har programmert slik). Vi sørger så for at metoden virker for n = 1 (basistilfellet) og metoden vil være korrekt (ved induksjon). Programmet blir det samme uansett utviklingsmetode. Vi skriver algoritmen i java: Stein Michael Storleer 24. april 2007 Ark 19 av 32 Stein Michael Storleer 24. april 2007 Ark 20 av 32

Rekursiv metode Søking I programeksemplene bruker vi en array som kanskje inneholder en verdi som vi søker. public static void flytt(int ant, int fra, int til, int via) { if (ant == 0) { else { flytt(ant 1, fra, via, til); flytt1(fra, til); flytt(ant 1, via, til, fra); public static void flytt1(int fra, int til) { antallflytt++; System.out.println( Flytter en plate fra pinne + fra + til pinne + til); Hva er basistilfellet og er de rekursive kallene nærmere dette? Hvordan representerer vi pinner og plater i programmet (datamodellen)? Lineær søking For å lete etter et element i en usortert array: int linearsok(int[] a, int elem) { boolean funnet = false; int indeks = 0; while (indeks < a.length &&!funnet) { if (a[indeks] == elem) { funnet = true; else { indeks++; if (funnet) { return indeks; else { return -1; Stein Michael Storleer 24. april 2007 Ark 21 av 32 Stein Michael Storleer 24. april 2007 Ark 22 av 32 Binærsøk For å lete etter et element i en sortert array: Sortering Forutsetter at vi kan rangere elementene: Gitt to elementer: Programmet må kunne teste om det ene elementet er lik, mindre enn eller større enn det andre. int binarsok(int[] a, int fra, int til, int elem) { int midten; if (fra > til) { return -1; else { midten = (fra + til) / 2; if (elem == a[midten]) { return midten; else if (elem < a[midten]) { return binarsok(a, fra, midten-1, elem); else { // elem > a[midten] return binarsok(a, midten+1, til, elem); Innstikksortering Generell idé: Plukk ett og ett element fra listen og sett det inn på rett plass (sortert) i en ny liste. Dette kan gjøre i en array: ❶ Finn første element fra venstre som er mindre enn det til venstre for seg ta dette ut. ❷ Elementene til venstre for dette skyves mot høyre inntil det uttatte elementet passer inn. ❸ Gjenta 1 2 inntil det siste elementet (helt til høyre) er behandlet. Stein Michael Storleer 24. april 2007 Ark 23 av 32 Stein Michael Storleer 24. april 2007 Ark 24 av 32

Quicksort void innstikksortering(char[] a) { for (int k = 0; k < a.length - 1; k++) { if (a[k + 1] < a[k]) { // a[k + 1] står på feil plass char tmp = a[k + 1]; int i = k; while (i >= 0 && a[i] > tmp) { // a[i] > tmp, flytt til høyre a[i + 1] = a[i]; i--; a[i+1] = tmp; // sett tmp på rett plass 0 1 2 3 4 5 6 7 8 Programmeringside, programskisse 1a) Del arrayen i to deler, slik at alle elementer i den ene delen er mindre enn alle elementer i den andre delen. 1b) 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. 2) 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. 3) Sorter de to delene rekursivt (ved å starte fra 1). Hvis de to delene blir riktig sortert, vil da hele arrayen være sortert. Stein Michael Storleer 24. april 2007 Ark 25 av 32 Ved å søge 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 1 eller 0, da trenger vi ikke sortere og det blir ingen rekursive kall. Stein Michael Storleer 24. april 2007 Ark 26 av 32 Forfining av programskissen for quicksort ❶ Hvis antall elementer som skal sorteres er 0 eller 1, returner. ❷ Plukk et ( middels stort ) element fra mengden som skal sorteres. Dette kalles pivot elementet. ❸ Del resten av elementene i to: De som er mindre enn pivot elementet. Hvilken sorteringsagoritme bør vi velge? For små arrayer med N 20 er quicksort mindre effektiv enn innstikksortering. På grunn av de rekursive kallene vil dette være et vanlig tilfelle! De som er større enn pivot elementet. ❹ Sorter disse delmengdene hver for seg (ved hjelp av quicksort). ❺ Returner sorteringen av de små elementene, etterfulgt av pivot elementet, etterfulgt av sorteringen av de store elementene. Løsning: Bruk en avskjæring mellom 5 og 20 (vanligvis 10) slik at arraysegmenter mindre enn dette sorteres ved hjelp av innstikksortering. Stein Michael Storleer 24. april 2007 Ark 27 av 32 Stein Michael Storleer 24. april 2007 Ark 28 av 32

Partisjoneringsstrategi Dette blir lett feil hvis man ikke er nøyaktig! ❶ Få pivot elementet vekk ved å bytte det med det siste elementet. Hvordan velge pivot elementet? Ideelt: Et pivot element som deler mengden i to like store halvdeler. ❷ La i starte på det første elementet, og j på det nest siste. ❸ Så lenge i er til venstre for j: 1 Flytt i mot høyre så lenge elementet i peker på er mindre enn pivot elementet. 2 Flytt j mot venstre så lenge a[j] er større enn pivot elementet. 3 i peker nå på et stort element og j på et lite. Hvis i er til venstre for j, byttes disse elementene. I praksis: Velger pivot elementet så tilfeldig som mulig. Vi skal bruke midten av tre partisjonering: Se på det første, midterste og siste elementet. Velg det mellomste av disse som pivot. Implementasjonen vil også sortere disse tre elementene, samt skjule pivot elementet. ❹ Bytt pivot elementet med elementet i posisjon i. Stein Michael Storleer 24. april 2007 Ark 29 av 32 Stein Michael Storleer 24. april 2007 Ark 30 av 32 Implementasjon Midten av tre char midtenavtre(char[] a, int fra, int til) { int midten = (fra + til) / 2; if (a[midten] < a[fra]) { bytt(a, fra, midten); if (a[til] < a[fra]) { bytt(a, fra, til); if (a[til] < a[midten]) { bytt(a, midten, til); // Skjul pivot-elementet nest lengst til høyre bytt(a, midten, til-1); return a[til-1]; Hovedmetoden i quicksort void quicksort(char[] a, int fra, int til) { if (til - fra <= 1) { // Et array-segment på 0 eller 1 element er sortert if (til - fra == 1) { // 2 elementer: a[fra og a[til] if (a[fra] > a[til]) bytt(a, fra, til); return; int pivotindeks; char pivot = midtenavtre(a, fra, til); int i = fra; int j = til-1; while (true) { while (a[++i] < pivot) { while (a[--j] > pivot) { if (i < j) { bytt(a, i, j); else { break; pivotindeks = i; bytt(a, pivotindeks, til-1); quicksort(a, fra, pivotindeks-1); quicksort(a, pivotindeks+1, til); Stein Michael Storleer 24. april 2007 Ark 31 av 32 Stein Michael Storleer 24. april 2007 Ark 32 av 32