• No results found

Lektion 15 - sortering, sökning och rekursiva metoder

N/A
N/A
Protected

Academic year: 2021

Share "Lektion 15 - sortering, sökning och rekursiva metoder"

Copied!
32
0
0

Loading.... (view fulltext now)

Full text

(1)

Lektion 15

Sortering, Sökning och rekursiva

metoder

(2)

Innehåll

Sortering

Bubble Sort

Selection Sort

Insertion Sort

Sökning

Sekventiell sökning

Binär sökning

Rekursiva metoder

Övningar

(3)

Sorteringsmetoder

Sortering är en vanlig del i programmering

Det viktigaste är att göra tidseffektiva

sorteringsalgoritmer

Sorteringen i en array görs med hjälp av en

temporär (”slask”)variabel:

temp = v[a];

v[a] = v[b];

v[b] = temp;

(4)

Bubble Sort

Bubbelsortering

Jämför tal för tal

Gör platsbyte om så önskas

Gå igenom arrayen igen men uteslut sista

platsen etc.

(5)

Bubbelsortering

Jämförelse v[0] v[1] v[2] v[3] v[4] startvärden 20 22 3 12 2 element 0 och 1 20 22 3 12 2 element 1 och 2 20 3 22 12 2 element 2 och 3 20 3 12 22 2 element 3 och 4 20 3 12 2 22

(6)

Bubbelsortering 2:a varvet

Jämförelse v[0] v[1] v[2] v[3] v[4] startvärden 20 3 12 2 22 element 0 och 1 3 20 12 2 22 element 1 och 2 3 12 20 2 22 element 2 och 3 3 12 2 20 22

(7)

Jämförelse v[0] v[1] v[2] v[3] v[4]

startvärden 3 12 2 20 22

element 0 och 1 3 12 2 20 22

element 1 och 2 3 2 12 20 22

Bubbelsortering 3:e varvet

(8)

Jämförelse v[0] v[1] v[2] v[3] v[4]

startvärden 3 2 12 20 22

element 0 och 1 2 3 12 20 22

Bubbelsortering 4:e varvet

(9)

Programkod (Tal)

public class Sort { //bubbelsortering

public static void bubbleSort(double data[]) { for(int m = data.length-1; m > 0; m--) {

for(int n = 0; n < m; n++) { if(data[n] > data[n+1]) { double temp = data[n]; data[n] = data[n+1]; data[n+1] = temp; } } } } }

//1:a gången ska du ta med alla talen utom sista talet

//Minska med ett varje gång

//Jämförelse och ev byte

(10)

Programkod (String)

public class Sort {

//bubbelsortering med String

public static void bubbleSort(String data[]) { for(int m = data.length-1; m > 0; m--) {

for(int n = 0; n < m; n++) {

if(data[n].compareTo(data[n+1]) >0 ) { String temp = data[n];

data[n] = data[n+1]; data[n+1] = temp; } } } } }

//1:a gången ska du ta med alla talen utom sista talet

//Minska med ett varje gång

//Jämförelse och ev byte

(11)

5 minutersövning

Sortera talföljden {6, 3, 8, 1, 5} ”för hand” i stigande ordning

m h a bubbelsortering.

6 3 8 1 5

3 6

8 1 5

3 6

1 8

5

3 6 1

5 8

3

1 6

5 8

3 1

5 6

8

1 3

5 6 8

Största talet sist

2:a största talet näst sist

(12)

Utväljande sortering

Ställ dig på första positionen

Gå igenom fältet och sök upp minsta/största

Gör ev. platsbytet efter genomgång

Gå igenom fältet, men uteslut 1:a platsen

Gör platsbytet efter genomgång

Gå igenom fältet, men uteslut också 2:a platsen

osv

(13)

Selection sort

Jämförelse v[0] v[1] v[2] v[3] v[4] startvärden 12 7 16 9 4 1:a varvet 4 7 16 9 12 2:a varvet 4 7 16 9 12 3:e varvet 4 7 9 16 12 4:e varvet 4 7 9 12 16

(14)

5 minutersövning

Sortera talföljden {6, 3, 8, 1, 5} ”för hand” i

stigande ordning m h a utväljande sortering

(Selection Sort).

6 3 8 1 5

1

3 8

6

5

1 3 8 6 5

1 3

5

6

8

Minsta talet först

2:a minsta talet näst först

(15)

Programmeringskod

public class Sort{ // bubbelsortering // selection sort

public static void selSort(double[] data){ for(int m = 0; m < data.length; m++){ int position = m; for(int n = m+1; n < data.length; n++){ if(data[n] < data[position]){ position = n; } } if(m != position){

double temp = data[m];

data[m] = data[position]; data[position] = temp; } } } }

(16)

Infogande sortering

Tanken är att vi utgår från ett sorterat

material.

När element läggs in sorteras materialet.

Bra att använda då man successivt lägger

in element i ett fält under körningens gång.

Insertion sort på engelska

(17)
(18)

Infogande sortering

// infogande sortering

public static void infSort(double data[], int antal) {

for (int m = 1; m < antal; m++){ int pos = m;

double temp = data[m];

while (pos > 0 && data[pos–1] > temp){ data[pos] = data[pos–1]; pos––; } data[pos] = temp; } } temp 6 5 9 1 pos m 0 1 2 3

(19)

Sekventiell sökning

Sekventiell sökning

Går igenom fältet från början till slut

Sökningen avbryts när vi har hittat det sökta

//fält med tal

int tal = Keyboard.readInt(); boolean found = false;

for(int i = 0; i < v.length && !found; i++){ if(v[i] == tal){

found = true; int pos = i; }

(20)

Binär sökning

min mitt max

Bör användas då man ska söka igenom ett stort material som

är sorterat!

Exempel: Säg att vi söker efter talet 19. tal = 19

int min = 0;

int max = v.length-1; int pos = -1;

while(min <= max && pos == -1){ int mitt = (min+max)/2;

if(tal > v[mitt]) min = mitt+1;

else if(tal < v[mitt]) max = mitt-1;

else

pos = mitt; }

(21)

Binär sökning

min mitt max

Bör användas då man ska söka igenom ett stort material som

är sorterat!

Exempel: Säg att vi söker efter talet 7. tal = 7

int min = 0;

int max = v.length-1; int pos = -1;

while(min <= max && pos == -1){ int mitt = (min+max)/2;

if(tal > v[mitt]) min = mitt+1;

else if(tal < v[mitt]) max = mitt-1;

else

pos = mitt; }

(22)

Binär sökning

min mitt max

Bör användas då man ska söka igenom ett stort material som

är sorterat!

Exempel: Säg att vi söker efter talet 5. tal = 5

int min = 0;

int max = v.length-1; int pos = -1;

while(min <= max && pos == -1){ int mitt = (min+max)/2;

if(tal > v[mitt]) min = mitt+1;

else if(tal < v[mitt]) max = mitt-1;

else

pos = mitt; }

(23)

Binär sökning

min mitt max

Bör användas då man ska söka igenom ett stort material som

är sorterat!

Exempel: Säg att vi söker efter talet -1. tal = -1

int min = 0;

int max = v.length-1; int pos = -1;

while(min <= max && pos == -1){ int mitt = (min+max)/2;

if(tal > v[mitt]) min = mitt+1;

else if(tal < v[mitt]) max = mitt-1;

else

pos = mitt; }

(24)

Repetition

Varför heter det Bubbelsortering?

Svar: Värden byter högst en position åt gången. Det sorterade materialet flyttas uppåt som luftbubblor i vatten.

Vad skiljer den infogande sorteringen (Insertion sort) från

de övriga enklare sorteringsalgoritmerna?

Svar: Fältet fram till det värde som ska sorteras är redan sorterat. Det nya värde som ska sorteras ”sätts in”, infogas, på rätt plats i det sorterade fältet.

Varför bör ett material sorteras för att kunna bestämma

median?

Svar: Medianen är det mittersta värdet.

Måste ett material sorteras för att bestämma

variationsbredden (Största värde –Minsta värde)?

(25)

Sortera talföljden {6, 3, 8, 1, 5} ”för hand” i stigande ordning m h a: 1. Bubbelsortering 6 3 8 1 5 3 6 8 1 5 3 6 1 8 5 3 6 1 5 8 3 1 6 5 8 3 1 5 6 8 1 3 5 6 8 2. Infogande sortering 6 3 8 1 5 3 6 8 1 5 1 3 6 8 5 1 3 5 6 8 3. utväljande sortering 6 3 8 1 5 1 3 8 6 5 1 3 5 6 8

Repetition sorteringsalgoritmer

(26)

Repetition sökning

Vad är det för skillnad på sekventiell och binär sökning?

Svar: Sekventiell sökning söker igenom materialet

från början till slut. Materialet behöver inte vara

sorterat.

TiIl binär sökning behövs ett sorterat material. Den

delar upp materialet successivt i två lika stora delar.

Därefter avgörs i vilken del som sökningen ska

(27)

Rekursiva metoder

Väldigt snabba sorteringsmetoder

Svåra att följa programmeringsstrukturen

Från metoden anropas samma metod

(28)

Rekursiva metoder

public class SummaRekursiv {

public static void main(String[] args) { Scanner sc = new Scanner(System.in);

System.out.print("Ange hur många tal du vill summera: ");

int n = sc.nextInt();

System.out.println("Summan blir: " + sum(n)); }

public static int sum(int antal) { if (antal == 1)

return 1; else

return antal + sum(antal-1); }

(29)

Mergesort

Söndra-och-härska:

Dela upp ett givet problem i delproblem.

Lös delproblemen rekursivt

Sätt samman delproblemslösningarna till en lösning

på det ursprungliga problemet.

För det rekursiva anropet behövs ett basfall, en

lösning för små problem

Trivialt enkelt för tomma listan och listan med ett

element i.

Oftast effektivare att sätta gränsen för ”små” problem

tidigare och använda annan sorteringsalgoritm för

(30)
(31)

Jämförelse

(32)

Uppgifter

Tänk på att när du skriver dina sorteringsmetoder som klassmetoder (static). Skriv dem i samma klass Sort.

1. Gör avsnittet om rekursiva metoder s. 24-25 i kapitel 8

2. Börja arbeta med kapitel 9. (Du behöver ett antal klasser från tidigare kapitel.)

References

Related documents

Totalt har den svenska energianvändningen ökat med 25 procent sedan 1970 trots stora energieffektiviseringar inom industrin och bostads-/service- sektorn.. Störst öknin sker

För att minimera att avfall uppstår och för att skapa förutsättningar att sortera material/avfall på rätt sätt krävs ett kollektivt ansvarstagande bland alla anställda

Metoden är utvecklad för att bedöma packbarheten hos finkorniga fyllnadsmassor och tar fram ett samband mellan jordmaterialets vattenkvot och den energimängd som åtgår för att fullt

Vi har fem mål som visar vad vi satsar särskilt på, för att utveckla och förbättra vår kommun.. En av landets

För att ta ett fortsatt ansvar för kommunens högt profilerade fastigheter, riktar Nystart Enköping följande uppdrag till Tekniska nämnden:.  Ta fram ett underlag som

Skala 1:100 2010-05-28 RITAD AV: MIA HANSSON, ARKITEKT. REV: Måtten på planritningen ska anges

Bibliotekarie 4 beskriver en morgon då sex skolklasser kom till biblioteket samtidigt klockan tio: ”Alltså det är ju flera hundra barn som bara ru- sar in och alla är ju

Stockholmshem lät värdera fastigheten och värderingen ligger till grund för föreningens pris för att köpa husen!. Priserbjudandet med bilagor har kommit föreningen och