Lektion 15
Sortering, Sökning och rekursiva
metoder
Innehåll
•
Sortering
–
Bubble Sort
–
Selection Sort
–
Insertion Sort
•
Sökning
–
Sekventiell sökning
–
Binär sökning
•
Rekursiva metoder
•
Övningar
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;
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.
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 22Bubbelsortering 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 22Jä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
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
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
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
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
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
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 165 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örst2:a minsta talet näst först
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; } } } }
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
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
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 talint tal = Keyboard.readInt(); boolean found = false;
for(int i = 0; i < v.length && !found; i++){ if(v[i] == tal){
found = true; int pos = i; }
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; }
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; }
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; }
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; }
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)?
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
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
Rekursiva metoder
•
Väldigt snabba sorteringsmetoder
•
Svåra att följa programmeringsstrukturen
•
Från metoden anropas samma metod
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); }
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
Jämförelse
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.)