Sortieren

Werbung
Fakultät für
Wirtschaftswissenschaften
Einführung in die Programmierung
Algorithmen
Uwe Lämmel
www.wi.hs-wismar.de/~laemmel
[email protected]
Uwe Lämmel
Algorithmen
Folie 1
Inhalt
 Suchen
– lineare Suche
– binäre Suche
 Sortieren
– Sortieren durch Auswahl
– Sortieren durch Vertauschen
– (Quicksort)
 dabei benutzte Konzepte
– Bibliotheksklasse
– ausführbare Klasse
– statische Methoden
– Array
 Programmierungstechnik
– Rekursion
– Try-catch-Anweisung
Uwe Lämmel
Algorithmen
Folie 2
Such-Methoden
 Parameter
– Folge von Elementen, in der gesucht wird: int, String, …
– Index, ab dem zu suchen ist: int
– Index, bis wo gesucht wird: int
– Das gesuchte Element: wie oben
 Ergebnis
– Index des gesuchten Elementes oder -1 (nicht enthalten)
public static int suche(int[] f, int anf, int ende, int gesucht)
Uwe Lämmel
Algorithmen
Folie 3
Sortier-Methoden
 Parameter
– Folge von Elementen, in der sortiert wird: int, String, …
– Index, ab dem zu sortieren ist: int
– Index, bis wo sortiert wird: int
 Ergebnis
– Folge von Elementen, jetzt sortiert: int, String, …
public static int[] sort(int[] f, int anf, int ende)
Uwe Lämmel
Algorithmen
Folie 4
Suche in einer beliebigen Folge
tom bea
pit
mae mia
lea
tim
kai
ende
anf
Lineare Suche

Alle Elemente, vom 1. bis zum letzten, durchsuchen

Folge kann unsortiert sein!

Ergebnis ist der Index
unten=anf; oben=ende–1;
int next= anf;
while (next<=oben && folge[next]!=gesucht) {
next++;
}
if ( next<=oben ) return next; else return –1;
Uwe Lämmel
Algorithmen
Folie 5
Suche in einer sortierten Folge
bea
anf
kai
lea mae mia
pit
tim
tom
ende
binäre Suche
 Folge muss sortiert sein!
 Halbieren des Suchraumes, durch Vergleich mit gesuchtem Element
unten = anf;
oben = ende – 1;
int next = (unten+oben)/2;
while ( unten<oben && folge[next]!=gesucht ) {
if ( gesucht<folge[next] ) oben=next –1; else unten=next+1;
next = ( unten+oben ) / 2;
} //while
if (folge[next]==gesucht) return next; else return –1 ;
Uwe Lämmel
Algorithmen
Folie 6
Inhalt
 Suchen
 Sortieren
– Sortieren durch Auswahl
– Sortieren durch Vertauschen
– (Quicksort)
 dabei benutzte Konzepte
– Bibliotheksklasse
– ausführbare Klasse
– statische Methoden
– Array
 Programmierungstechnik
– Rekursion
– Try-catch-Anweisung
Uwe Lämmel
Algorithmen
Folie 7
Sortieren
 Definition
 Assoziative Sortierverfahren:
– durch Auswahl: Select-Sort
– durch Vertauschen:
– Bubble Sort
– Quicksort
– Heap-sort
– durch Einfügen: Insert-Sort
– durch Mischen: Merge-Sort
– …
 Adressenorientiertes Sortieren
Uwe Lämmel
Algorithmen
Folie 8
Definition einer sortierten Folge?
Eine Folge von n Elementen ist sortiert,
wenn an der 1.-ten Position das Minimum der Folge steht,
und die Folge vom 2. bis zum (n)-ten Element sortiert ist !
Eine Folge aus einem Element ist sortiert.
 Select-Sort
Eine Folge von n Elementen ai ist sortiert,
falls für alle i: 1<in gilt: ai>ai-1
 Bubble-Sort
Uwe Lämmel
Algorithmen
Folie 9
Select-Sort: Beispiel
50 77 3 43 78 1 27 2
3
0
1
2
3 27 78 50 43 77
4
1 77 3 43 78 50 27 2
1
1
2
3 27 43 50 78 77
5
1
2
3 43 78 50 27 77
1
2
3 27 43 50 78 77
2
1
2
3 43 78 50 27 77
6
1
2
3 27 43 50 77 78
3
Uwe Lämmel
Algorithmen
Folie 10
Select-Sort: rekursiv
 Folge ist von Position anf bis ende–1 belegt
 Noch 2 Elemente in Folge (anf<ende-1), dann
– Bestimme Position des Minimums
– Tausche Minimum mit erstem Element
– Sortiere die Restfolge (ab anf+1)
Uwe Lämmel
Algorithmen
Folie 11
Select–Sort: iterativ
 Folge ist von Position anf bis ende–1 belegt
 Von der ersten (anf.) bis zur vorletzten Position wiederhole
in dieser Teilfolge:
– Setze erstes Element als temporäres Minimum
– Wiederhole bis zur letzten Position
– Falls temporäres Minimum> als aktuelles Element, dann
setze neuen Minimum
– Setze Erstes Element an Stelle des Minimums
– Setze Minimum an erste Position
Uwe Lämmel
Algorithmen
Folie 12
Bubble–Sort
 Folge von Position anf bis (ende–1) belegt
 Wiederhole
von erster bis vorletzter Position
– Falls Element < als Nachfolger dann
tausche beide Elemente
Bis nicht mehr getauscht wurde
Uwe Lämmel
Algorithmen
Folie 13
Quicksort
 Wähle ein Pivot-Element
– Erstes, mittleres, zufälliges…
 Teile die Folge in die …
– … Teilfolge der kleineren Elemente
– … Teilfolge der größeren Elemente (als Pivot-Element)
 Quicksort für die Folge der kleineren Elemente
 Quicksort für die Folge der größeren Elemente
Uwe Lämmel
Algorithmen
Folie 14
Quicksort – Implementierung
 Pivot-Element festlegen:
– erstes, mittleres, Median
 wiederhole:
– Zeiger von links bis El > Pivot
– Zeiger von rechts bis El < Pivot
– Falls Zeiger: links<rechts dann El tauschen
und Zeiger weitersetzen
bis Zeiger aneinander vorbei
 sortiere den Abschnitt der kleineren Zahlen
 sortiere den Abschnitt der größeren Zahlen
Uwe Lämmel
Algorithmen
Folie 15
Quicksort
Uwe Lämmel
static int[ ] quicksort(int[ ] folge, int anf, int ende) {
int pivot;
// Element zum Vergleich
int hilf;
int gk, gg;
// GrenzeKleinere,GrenzeGroessere
if (anf<ende) { // noch mind. zwei Elemente?
pivot=folge[anf];
gk=anf; gg=ende;
do {
// Solange noch nicht alles verteilt
while (folge[gk]<pivot) gk++;
while (folge[gg]>pivot) gg--;
if (gk<=gg) { // Vertausche gg-te mit gk-te Position
hilf=folge[gg]; folge[gg]=folge[gk]; folge[gk]=hilf;
gk++; gg--;
} // if
}
while (gk<=gg);
if (anf<gg) folge = quicksort(folge,anf,gg);
// kleinere
if (gk<ende) folge = quicksort(folge,gk,ende); // groessere
} // if
return folge;
} //sort
Algorithmen
Folie 16
Inhalt
 Suchen
 Sortieren
 Konzepte
– Bibliotheksklasse
– ausführbare Klasse
– statische Methoden
– Array
 Programmierungstechnik
– Rekursion
– Try-catch-Anweisung
Uwe Lämmel
Algorithmen
Folie 17
Klasse – Bibliothek
 keine Beschreibung von Objekten
 Menge von Methoden
– siehe z.B. java.lang.Math
 Methoden sind statisch – static
public static int ggT(int a, int b) {
if(a==b)
return a;
else if(a>b) return ggT(a-b,b);
else
return ggT(a,b-a);
} //ggT
Uwe Lämmel
Algorithmen
Folie 18
Klasse – Bibliothek
class Algorithmen {
public static int[ ] bubbleSort(int[ ] folge, int anf, int ende) { … }
public static int[ ] selectSort(int[ ] folge, int anf, int ende) { … }
public static int getMax(int[ ] folge, int anf, int ende) { … }
public static int finde(int[ ] folge, int anf, int ende, int el) { … }
…
public static void ausgeben(int[ ] folge, int anf, int ende) { … }
public static int[ ] testfolge = {76,23,12,54,78,22,45,33,90,51,52,41};
} //Algorithmen
Uwe Lämmel
Algorithmen
Folie 19
Methode statisch oder nicht?
Objekt oder nicht Objekt?
statisch (static):
 definiert in Bibliotheks- oder ausführbarer Klasse!
public static int finde(int[ ] folge, int anf, int ende, int el) { … };

Aufruf: Methode wird nicht an Objekt gesendet!!
index = finde(testfolge,0,8,51);
eventuell Angabe der Klasse nötig:
a = Math.sqrt(z);
index =Algorithmen.finde(testfolge,0,8,51);
dynamisch:
 definiert Objekt-Verhalten in Bauplan-Klasse
public int finde(int el) { … };

Uwe Lämmel
Aufruf: Methode wird an Objekt gesendet!
index = telefonbuch.finde(110);
Algorithmen
Folie 20
Aufgaben für statische Funktionen
Such-, und Sortiermethoden
!Üben!
Einlesen von Zahlen auf ein Array
Ausgabe eines Arrays
Methoden für natürliche Zahlen:
– Test, ob Zahl ideal ist:
Zahl = Summe aller echten Teiler
– Test, ob eingegeben Zahl eine Primzahl ist
– Berechnung aller Primzahlen bis zu einer
vorgegebenen Zahl
– Collatz-Funktion für alle Zahlen bis zu einer
einzugebenden Grenze
 …




Uwe Lämmel
Algorithmen
Folie 21
Ungewöhnliches Beispiel: Collatz-Funktion
Collatz-Wert einer natürlichen Zahl n:
= Anzahl der folgenden Schritte bis eine 1 erreicht wird:
 Ist n gerade, dann wird durch 2 dividiert: n:=n div 2
 Ist n ungerade, dann: n:= 3n+1
Uwe Lämmel
Collatz-Funktion
120
100
Collatz(N)
collatz(6)?
1.
3
2. 10
3.
5
4. 16
5.
8
6.
4
7.
2
8.
1
collatz(6)=8
80
60
40
20
0
1
11
21
31
41
51
61
71
81
91
Algorithmen
N
Folie 22
Inhalt
 Suchen
 Sortieren
 benutzte Konzepte
 Programmierungstechnik
– Rekursion
– Try-catch-Anweisung
Uwe Lämmel
Algorithmen
Folie 23
Rekursion
 Definition einer Methode,
wobei die Methode selbst hierzu benutzt wird
 Rekursionsabbruch vor rekursivem Aufruf
if ( Bedingung) rekursiver Aufruf
else kein rekursiver Aufruf (Rekursionsabbruch)
 Problem muss beim rekursiven Aufruf kleiner werden:
public static long fak(int n) {
if (n > 0) return n*fak(n-1); else return 1;
}//fak
Uwe Lämmel
Algorithmen
Folie 24
Rekursion, ein einfaches Beispiel: Fakultät
6
fak(3)
3 * fak(2)
public static long fak(int n) {
if (n > 0) return n*fak(n-1);
else
return 1;
} //fak
2
fak(2)
2 * fak(1)
1
fak(1)
1 * fak(0)
fak(0)
1
1
Uwe Lämmel
Algorithmen
Folie 25
Rekursion: Fibonacci(5) - Aufrufstruktur
fibo(n) = 1, falls n=1 oder n=2
= fibo(n-1)+fibo(n-2)
fibonacci(5)
fibonacci(4)
fibonacci(3)
fibonacci(2)
fibonacci(3)
fibonacci(2)
fibonacci(2)
fibonacci(1)
fibonacci(1)
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Uwe Lämmel
Algorithmen
Folie 26
Rekursion: Turm von Hanoi
Ausgangsort




Zielort
Hilfsort
Turm vom Ausgangs- zum Zielort bewegen
Immer nur eine Etage
Es darf keine größere Etage auf eine kleinere gesetzt werden
Es steht nur ein Hilfsort zum Zwischenstapeln zur Verfügung
Uwe Lämmel
Algorithmen
Folie 27
Rekursion: Aufgaben
 Bestimmen der Quersumme einer Zahl (rekursiv!)
 Berechnen der Ackermann-Funktion ackermann(x,y)
– Bis zu welchen Parametern x,y erhält man Ergebnisse?
Uwe Lämmel
Algorithmen
Folie 28
Strukturierte Anweisung: try-catch
try {
Anweisungen1 // geschützte Ausführung
}
catch ( ExceptionTyp e) {
Anweisungen2 // Fehlerbehandlung und Information
}
 Anweisungen1 werden ausgeführt:
– falls Fehler (Ausnahme, Exception) und
– Fehler ist vom Typ ExceptionTyp:
– Anweisungen2 werden ausgeführt
Uwe Lämmel
Algorithmen
Folie 29
Strukturierte Anweisung: try-catch-Beispiel

wiederholte Eingabe-Aufforderung:
…
do {
try {
int zahl = ea.readInt("Bitte Zahl eingeben: ");
ende = (zahl== –1); // true, falls Zahl gleich –1
}
catch (NumberFormatException ex){
ea.writeln(ex.getMessage()+ " Das war falsch!");
ende = false;
}
catch( IOException io) { }
}
while(!ende);
Uwe Lämmel
Algorithmen
Folie 30
Nur zum
Testen
import java.io.*;
/**
*
* Veranschaulichung der Wirkung der try-catch-Anweisung:
* Wiederholte Eingabe-Aufforderung bis eine gültige Zahl eingegeben wurde.
* Es werden zwei Ausnahmen behandelt:
* - Die Ein-Aussgabe-Ausnahme (IOException) MUSS formuliert werden,
* da jede Ein-, Ausgabe fehlerhaft sein kann: Datei nicht vorhanden ...
* - Zahlenformat-Ausnahme KANN formuliert werden. Diese tritt in Kraft, wenn
* der Nutzer eine ungültige Zahl eingibt.
*
* @version 1.0 vom 25.06.2010
* @author Uwe Lämmel
*/
public class TryCatch {
public static void main(String[] args) {
LineIO ea = new LineIO();
boolean ende = false;
do{
try{
int zahl=ea.readInt("Bitte Zahl eingeben: ");
ende = (zahl== -1);
}
catch(NumberFormatException ex){
ea.writeln(ex.getMessage()+ " Das wahr falsch!");
ende=false;
}
catch( IOException io){}
}
while(!ende);
ea.writeln("Ende");
}//main
}//TryCatch
Uwe Lämmel
Algorithmen
Folie 31
Zusammenfassung
 Suchen
– lineare S. in unsortierten Folgen
– binäre S. in sortierten Folgen
– Maximum
 Sortieren
– durch Auswahl,
– durch Vertauschen: Bubble, Quicksort
 Klasse
– Bauplan-, Bibliotheks-, ausführbare Klasse
 statische Methoden, statische Methode main
 rekursives Programmieren
 try-catch-Anweisung
Uwe Lämmel
Algorithmen
Folie 32
Aufgabe zum Suchen und Sortieren:
Das Firmen-Telefonbuch
 Für jeden Mitarbeiter wird verwaltet:
– Name, Vorname, ZimmerNummer, ApparatNummer
 Die Firma wird nicht mehr als 50 Mitarbeiter in den nächsten
Jahren haben.
Implementieren
 Funktionalität:
Sie das
– Erfassen eines neuen Mitarbeiters
Telefonbuch
mittels eines
– Ändern der Daten eines Mitarbeiters
Array von
– Suche nach ZimmerNummer eines Mitarbeiters
Mitarbeiter– Suche nach TelefonNummer eines Mitarbeiters
Objekten
– Anzeige aller Mitarbeiter in einem Zimmer
– Anzeige aller Mitarbeiter mit einer bestimmten Apparatnummer
– Ausgabe aller Informationen als Liste –sortiert nach:
Namen oder Zimmernummer
Uwe Lämmel
Algorithmen
Folie 33
Herunterladen