Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
faecher:informatik:oberstufe:algorithmen:sorting:mergesort:start [05.02.2024 09:40] – Marco Kuemmel | faecher:informatik:oberstufe:algorithmen:sorting:mergesort:start [13.02.2025 07:22] (aktuell) – Frank Schiebel | ||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
===== Grundsätzliche Funktionsweise ===== | ===== Grundsätzliche Funktionsweise ===== | ||
- | Mergesort ist eine Divide-and-Conquer Algorithmus, | + | Mergesort ist eine [[faecher: |
* **Teile** das Array in zwei Hälften (Divide). | * **Teile** das Array in zwei Hälften (Divide). | ||
Zeile 174: | Zeile 174: | ||
=== (A2) === | === (A2) === | ||
- | Gib den Aufwand | + | Gib zunächst **getrennt** |
===== Mergesort: Versuch 1 ===== | ===== Mergesort: Versuch 1 ===== | ||
Zeile 196: | Zeile 195: | ||
mitte = a.lange/2 | mitte = a.lange/2 | ||
| | ||
- | ta1=teilarray von a von 0 bis mitte | + | ta1=teilarray von a von 0 bis mitte-1 |
- | ta2=teilarray von mitte+1 bis a.laenge-1 | + | ta2=teilarray von mitte bis a.laenge-1 |
| | ||
return merge(msort(ta1), | return merge(msort(ta1), | ||
Zeile 206: | Zeile 205: | ||
* Bewerte die Implementation in Hinsicht auf Ressourcenverbrauch und Effizienz | * Bewerte die Implementation in Hinsicht auf Ressourcenverbrauch und Effizienz | ||
+ | ++++ Lösungsvorschlag | | ||
+ | |||
+ | <code java> | ||
+ | // Mergesort naiv | ||
+ | public String[] msort(String[] a) { | ||
+ | // Implementiere hier gemäß des Pseudocodes im Wiki | ||
+ | if(a.length == 1) { | ||
+ | return a; | ||
+ | } | ||
+ | |||
+ | int mitte = a.length/2; | ||
+ | // Dieser Schritt ist aufwändig! | ||
+ | // Man muss Arrays erzeugen und alle Elemente | ||
+ | // in die neuen Teilarrays hineinkopieren. | ||
+ | // das ist O(n) bei jedem Aufruf :( | ||
+ | String[] ta1 = new String[mitte]; | ||
+ | String[] ta2 = new String[a.length-mitte]; | ||
+ | for(int i=0; i<mitte; i++) { | ||
+ | ta1[i]=a[i]; | ||
+ | } | ||
+ | for(int i=mitte; i< | ||
+ | ta2[i-mitte] = a[i]; | ||
+ | } | ||
+ | return merge(msort(ta1), | ||
+ | } | ||
+ | </ | ||
+ | ++++ | ||
===== Arrayerzeugung ist teuer ===== | ===== Arrayerzeugung ist teuer ===== | ||
- | Prinzipiell funktioniert unser " | + | Prinzipiell funktioniert unser " |
==== Merge reloaded ==== | ==== Merge reloaded ==== | ||
Wir befassen uns zunächst nochmal mit dem Merge-Vorgang und implementieren mit unseren Kenntnissen vom ersten Versuch die Methode | Wir befassen uns zunächst nochmal mit dem Merge-Vorgang und implementieren mit unseren Kenntnissen vom ersten Versuch die Methode | ||
+ | <code java> | ||
public void merge(String[] a, String[] speicher, int min, int mitte, int max) | public void merge(String[] a, String[] speicher, int min, int mitte, int max) | ||
- | | + | </ |
- | in der Vorlage //StandaloneMerge//. Um diese Methode aufrufen zu können, müssen wir die beiden Arrays a und b im Konstruktor zusammenfügen und außerdem ein Speicherarray derselben Länge erzeugen, das man dem Methodenaufruf mitgeben kann. | + | |
+ | in der Klasse '' | ||
---- | ---- | ||
{{: | {{: | ||
- | === (A5) === | + | === (A4) === |
- | * Vollziehe das Zusammenfügen der Arrays, das Erzeugen des Speicher-Arrays und die Bestimmung den Methodenparameter nach | + | * Vollziehe das Zusammenfügen der Arrays, das Erzeugen des Speicher-Arrays und die Bestimmung den Methodenparameter nach. |
- | * Entferne die Kommentarzeichen vor dem Methodenaufruf im Konstruktor | + | * Entferne die Kommentarzeichen vor dem Methodenaufruf im Konstruktor. |
- | Der " | + | Der " |
- | Es ist also wichtig, beim Übertragen der Elemente ins Speicher-Arrays | + | Es ist also wichtig, beim Übertragen der Elemente ins Speicher-Array in der merge Methode bei '' |
<code java> | <code java> | ||
Zeile 252: | Zeile 279: | ||
---- | ---- | ||
{{: | {{: | ||
- | === (A6) === | + | === (A5) === |
Vervollständige die Implementierung, | Vervollständige die Implementierung, |