280 likes | 382 Views
Fakultät für Wirtschaftswissenschaften. Einführung in die Programmierung Algorithmen. Uwe Lämmel. www.wi.hs-wismar.de/~laemmel Uwe.Laemmel@hs-wismar.de. Inhalt. Suchen lineare Suche binäre Suche Sortieren Sortieren durch Auswahl Sortieren durch Vertauschen (Quicksort)
E N D
Fakultät für Wirtschaftswissenschaften Einführung in die ProgrammierungAlgorithmen Uwe Lämmel www.wi.hs-wismar.de/~laemmel Uwe.Laemmel@hs-wismar.de
Inhalt • Suchen • lineare Suche • binäre Suche • Sortieren • Sortieren durch Auswahl • Sortieren durch Vertauschen • (Quicksort) • dabei benutzte Konzepte • ausführbare Klasse • statische Methoden • Array
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; elsereturn –1;
Suche in einer sortierten Folge bea kai lea mae mia pit tim tom ende anf 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;} //whileif (folge[next]==gesucht) return next; elsereturn –1;
Sortieren • Definition • Assoziative Sortierverfahren: • durch Auswahl: Select-Sort • durch Vertauschen: Bubble Sort • ... • Adressenorientiertes Sortieren
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<in gilt: ai>ai-1 Bubble-Sort
50 77 3 43 78 1 27 2 3 1 2 3 27 78 50 43 77 0 4 1 77 3 43 78 50 27 2 1 2 3 27 43 50 78 77 1 5 1 2 3 43 78 50 27 77 1 2 3 27 43 50 78 77 6 1 2 3 43 78 50 27 77 1 2 3 27 43 50 77 78 3 Select-Sort: Beispiel 2
Select-Sort: rekursiv • Vektor feld: Position anf..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)
Select–Sort: iterativ • Vektor feld: Position anf..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
Bubble–Sort • Vektor feld: Position anf..(ende–1) belegt • Wiederhole von erster bis vorletzter Position • Falls Element < als Nachfolger dann tausche beide Elemente Bis nicht mehr getauscht wurde
Klasse – Bibliothek • keine Beschreibung von Objekten • Menge von Methoden • siehe z.B. java.lang.Math • Methoden sind statisch – static publicstaticint ggT(int a, int b) { if(a==b) return a; else if(a>b) return ggT(a-b,b); elsereturn ggT(a,b-a); } //ggT
Klasse – Bibliothek class Algorithmen { publicstaticint[ ] bubbleSort(int[ ] folge, int anf, int ende) { … } publicstaticint[ ] selectSort(int[ ] folge, int anf, int ende) { … } publicstaticint getMax(int[ ] folge, int anf, int ende) { … } publicstaticint finde(int[ ] folge, int anf, int ende, int el) { … } … publicstaticvoid ausgeben(int[ ] folge, int anf, int ende) { … } publicstaticint[ ] testfolge = {76,23,12,54,78,22,45,33,90,51,52,41}; } //Algorithmen
Methode statisch oder nicht?Objekt oder nicht Objekt? statisch (static): • definiert in Bibliotheks- oder ausführbarer Klasse! publicstaticint 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 publicint finde(int el) { … }; • Aufruf: Methode wird an Objekt gesendet!index = telefonbuch.finde(110);
!Üben! Aufgaben für statische Funktionen • Such-, und Sortiermethoden • 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 • …
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:= 3n+1 • collatz(6)? • 3 • 10 • 5 • 16 • 8 • 4 • 2 • 1 • collatz(6)=8
Rekursion • Definition einer Methode, wobei die Methode selbst hierzu benutzt wird • Rekursionsabbruch vor rekursivem Aufruf if ( Bedingung) rekursiver Aufrufelse kein rekursiver Aufruf (Rekursionsabbruch) • Problem muss beim rekursiven Aufruf kleiner werden: publicstaticlong fak(int n) { if (n > 0) return n*fak(n-1); elsereturn1; }//fak
publicstaticlong fak(int n) { if (n > 0) return n*fak(n-1); elsereturn 1; } //fak 6 2 1 1 fak(3) 3 * fak(2) fak(2) 2 * fak(1) fak(1) 1 * fak(0) fak(0) 1 Fakultät: ein einfaches Beispiel
fibonacci(5) fibonacci(4) fibonacci(3) fibonacci(2) fibonacci(2) fibonacci(3) fibonacci(1) fibonacci(2) fibonacci(1) Fibonacci(5) - Aufrufstruktur fibo(n) = 1, falls n=1 oder n=2 = fibo(n-1)+fibo(n-2) 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Turm von Hanoi • 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 Ausgangsort Zielort Hilfsort
Quicksort • 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 tauschenund Zeiger weitersetzen bis Zeiger aneinander vorbei • sortiere den Abschnitt der kleineren Zahlen • sortiere den Abschnitt der größeren Zahlen
Quicksort staticint[ ] 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); // kleinereif (gk<ende) folge = quicksort(folge,gk,ende); // groessere } // if return folge; } //sort
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. • Funktionalität: • Erfassen eines neuen Mitarbeiters • Ändern der Daten eines Mitarbeiters • Suche nach ZimmerNummer eines Mitarbeiters • Suche nach TelefonNummer eines Mitarbeiters • Anzeige aller Mitarbeiter in einem Zimmer • Anzeige aller Mitarbeiter mit einer bestimmten Apparatnummer • Ausgabe aller Informationen als Liste –sortiert nach:Namen oder Zimmernummer Implementieren Sie das Telefonbuch mittels eines Array von Mitarbeiter-Objekten
Strukturierte Anweisung: try-catch try { Anweisungen1 // geschützte Ausführung } catch ( ExceptionType) { Anweisungen2 // Fehlerbehandlung und Information } • Anweisungen1 werden ausgeführt: • falls Fehler (Ausnahme, Exception) und • Fehler ist vom Typ ExceptionTyp: • Anweisungen2 werden ausgeführt
Strukturierte Anweisung: try-catch-Beispiel … 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 wahr falsch!"); ende = false; } catch( IOException io) { } } while(!ende); • wiederholte Eingabe-Aufforderung:
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 Nur zum Testen
Mitarbeiter Telefonbuch Firma Element Telefonbuch – „uses“-Beziehungen
Zusammenfassung • Suchen • lineare S. in unsortierten Folgen • binäre S. in sortierten Folgen • Maximum • Sortieren • durch Auswahl, • durch Vertauschen: Bubble, Quicksort • Klasse • Bauplanklasse, • Bibliotheksklasse • ausführbare Klasse, • statische Methode, main • rekursives Programmieren