====== Problemstellung: Sortieren ====== ===== Beispiel: Eine Liste mit Personen ===== {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:liste.png?500 |}} Die Liste beinhaltet **Elemente** (Items), ein Element entspricht einer Zeile, sie soll sortiert werden nach einem (Sortier-)**Schlüssel** (Key). In diesem Fall soll der Sortierschlüssel der Nachname sein. Die Liste ist dann sortiert, wenn die Elemente anhand des Sortierschlüssels in eine **Reihenfolge** gebracht worden sind. {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:sorted.png?500 |}} Für verschiedene Schlüssel ergeben sich andere Reihenfolgen der Elemente: {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:sort_orders.png |}} ===== Ziel: Wir wollen alles mögliche Sortieren ===== ==== Beispiel 1: ==== Eine Liste zufälliger reeller Zahlen soll sortiert werden((Hört sich erst mal sinnlos an, eine Anwendung kommt später...)): {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:real.png?500 |}} ==== Beispiel 2: ==== Eine Wort-Liste soll sortiert werden: {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:worte.png?400 |}} ==== Beispiel 3: ==== Die Dateien in einem Verzeichnis sollen nach ihrem Namen sortiert werden: {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:dateien.png?500 |}} ==== Gemeinsamkeiten ==== In allen Beispielen wurde ein Array mit der (noch zu implementierenden) Methode ''Insertion.sort(array)'' sortiert. Dabei hatten sowohl Array-Elemente als auch die Sortierschlüssel verschiedenste Typen -- was für den Aufruf der Methode jedoch unerheblich war: Die Methode erhält als Argument das Array und sortiert es. Der Vorgang des Sortierens war vom Typ des Schlüssels, nach dem sortiert werden sollte ist vollkommen abstrahiert -- die ''sort()'' Methode hat immer funktioniert. ===== Callbacks und Interfaces ===== Ein Callback ist eine Referenz auf ausführbaren Code - bei den Sortierbeispielen oben geschieht stets folgendes: * Das Programm ruft die ''sort()''-Methode mit einem Array von Objekten auf. * Die ''sort()''-Methode ruft ihrerseits die ''compareTo()'' Methode der Objekte auf, um zu ermitteln, in welcher Reihenfolge diese angeordnet werden müssen. In Java werden solche Callbacks als **Interfaces** implementiert. Datentypen, die man sortieren kann, müssen in Java das **Comparable-Interface** implementieren. Zahlreiche Datentypen machen das "von sich aus", z.B. Integer, Double, String, Date, und File. ==== Eigene sortierbare Objekte ==== Wenn man eigene Objekte implementiert, die sortiert werden sollen, müssen diese eine Methode ''compareTo()'' implementieren, die entweder -1, +1 oder 0 zurückgibt, je nachdem wie der Vergleich ausfällt. Am besten sieht man das an einem Beispiel: public class Time implements Comparable Der Vergleich zweier Objekte des Typs ''Time'' findet dann folgendermaßen statt: Time t1 = new Time(15,5); Time t2 = new Time(15,7); if (t1.compareTo(t2) < 0 ) { System.out.println("t1 ist kleiner als t2"); } if (t1.compareTo(t2) > 0 ) System.out.println("t2 ist kleiner als t1"); } if (t1.compareTo(t2) == 0 ) System.out.println("t2 und t1 sind gleich"); } ---- {{:aufgabe.png?nolink |}} === (A1) === {{ :faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:ssp.png?200|}} * Teste das Beispiel mit der Klasse ''Time'' in BlueJ * Denke dir eine eigene Klasse aus, die das Comparable Interface implementiert, implementiere und teste sie. * Kann man das Spiel Schere-Stein-Papier mit einer Klasse ''Spielzug'' implementieren, die das Comparable Interface implementiert? Begründe deine Antwort. ===== Hilfsfunktionen ===== Da der Vergleich mittels ''etwas.compareTo(anderesEtwas) < 0'' ein wenig unhandlich ist, vereinbaren wir für diesen Wikibereich zwei **Hilfsfunktionen**, die uns die Implementation der Sortieralgorithmen erleichtern werden: ==== Kleiner... ==== Die Hilfsfunktion ''less'' nimmt zwei Elemete des Typs Comparable entgegen und liefert ''true'' zurück, wenn das erste kleiner ist als das zweite: private boolean less(Comparable v, Comparable w) { return v.compareTo(w) < 0; } ==== Platztausch ==== Die Hilfsfunktion ''exch'' vertauscht zwei Elemente eines Arrays: private void exch(Comparable[] a, int i, int j) { Comparable swap = a[i]; a[i] = a[j]; a[j] = swap; } ==== Sortiert? ==== Die letzte Hilfsfunktion gibt ''true'' zurück, wenn das Array sortiert ist: private boolean isSorted(Comparable[] a) { for (int i = 1; i < a.length; i++) { if (less(a[i], a[i-1])) return false; } return true; } ==== Material ==== {{simplefilelist>:faecher:informatik:oberstufe:algorithmen:sorting:problemstellung:*}}