Wie funktionieren diese Methoden in diesem Sortierverfahren genau?

bob651

Aktives Mitglied
HI, ich habe vor mir einen Mergesort liegen und muss es kommentieren.
Das habe ich gemacht. Aber bei manchen Methoden verstehe ich es einfach nicht. Hier erstmal der Code.
Code:
public class algo1 {
   
    private int[] array1;
    private int[] array2;
    private int lange;
    public static int[] Zahlen;
    public static double summe;
  
    public void zerlegen(int inputArray[]) {
        this.array1 = inputArray;
        this.lange = inputArray.length;
        this.array2 = new int[lange];
        mergesort(0, lange - 1); //methode mergesort
    }
  
    private void mergesort(int links, int rechts) {
           
        if (links < rechts) {       
           //sortiert links bis rechts, wenn es mehr als 1 element hat
          
            int mitte = (links + rechts) / 2;
            // zerlegt die  Arrays in 2 hälften
          
            mergesort(links, mitte);
            // linke Hälfte sortieren
         
            mergesort(mitte + 1, rechts);
            //rechte Hälfte sortiren
         
            mischen(links, mitte, rechts);
            //alles zusammen mischen
        }
    }
  
    private void mischen(int links, int mitte, int rechts) {
          //methode mischt alle arrays
        for (int i = links; i <= rechts; i++) {   
         //solange rechts größer/gleich links -->links erhöhen
            array2[i] = array1[i];
        }
      
        int i = links;            //i durchläuft von links bis mid
        int j = mitte + 1;    //j durchläuft von mid bis rechts
        int k = links;           //k durchläuft von links nach rechts
     
      
    
      
        while (i <= mitte && j <= rechts) {       
           //solange keine der beiden Arrays ganz durchlaufen sind
            if (array2[i] <= array2[j]) {
                array1[k] = array2[i];
                i++;
            } else {
                array1[k] = array2[j];
                j++;
            }
            k++;
        }
    
      
        while (i <= mitte) {                
           //Rest von links wird durchlaufen
            array1[k] = array2[i];
            k++;
            i++;
        }
     
    }
    }
  

    public static void main(String a[]) throws Exception{
        setUp();
        algo1 neuearray = new algo1();
        neuearray.zerlegen(Zahlen);
        //Array mit Zahlen erstellen
     
        for(int i:Zahlen){
            System.out.print(i);
            System.out.print(" ");
        }

    }

public static void setUp() throws Exception{
    File Text.txt = new File ("D:/Users/or/workspace/aab/src/abc/Text.txt");
    Zahlen = zahlenleser.FileToIntArray(Text.txt);

Hoffe das ist nicht zu lang.
Also ich habe die Methode "mischen" zwar kommentiert, weiß aber nicht wirklich wie es geht.
Und die Methode "zerlegen" habe ich auch nicht verstanden.
Es wäre echt eine riesen Hilfe, wenn sich jemand kurz Zeit nimmt und es mir kurz erklärt. Das wäre mega.
 

Robat

Top Contributor
Die Methode zerlegen würde ich so kommentieren:

Java:
   /**
     * Zerlegt ein Array in 2 Hälften
     * (bzw eigentlich wird nur ein Array mit identischer Länge erstellt)
     *
     * @param inputArray
     */
    public void zerlegen(int inputArray[]) {
        // array1 als Synonym für den ursprünglichen Input
        this.array1 = inputArray;
     
        // die Länge / Anz. der Elemente / Anz. der Zahlen bekommen
        this.lange = inputArray.length;
     
        // ein neues Arrray der selben länge anlegen
        this.array2 = new int[lange];
     
        // die Methode mergesort aufrufen, mit dem Anfangswert 0 und dem
        // Endwert lange - 1 .. 
        //-1 weil man bei 0 Anfängt mit zählen..
        // wir zählen 1,2,3.. n.. in einem Array wird 0,1,2,..,n-1 gezählt
        mergesort(0, lange - 1); //methode mergesort
    }
    // Ergänzend zu dem mergesort:
    //
    // Es wird geprüft, ob das Array aus min. 2 Elementen besteht.
    // Wenn das der Fall ist, wird die Mitte des Array bestimmt. Durch
    // rekursiven aufruf der Methode mergesort wird erst die untere Hälfte
    // des Array sortiert und danach die obere Hälfte.
    //
    // Danach werden die beiden sortierten Hälften in "mischen" mit einander
    // verschmolzen.
    //
    // BSP Array:
    //|7|1|2|9|2|4|9|6|7|9
    //
    // Aufteilen:
    // |7|1|2|9|2  |4|9|6|7|9
    //
    // links sortieren:
    // |1|2|2|7|9
    //
    // rechts sortieren:
    // |4|6|7|9|9
    //
    // @see mischen
    private void mergesort(int links, int rechts) {
          
        if (links < rechts) {     
           //sortiert links bis rechts, wenn es mehr als 1 element hat
        
            int mitte = (links + rechts) / 2;
            // zerlegt die  Arrays in 2 hälften
        
            mergesort(links, mitte);
            // linke Hälfte sortieren
        
            mergesort(mitte + 1, rechts);
            //rechte Hälfte sortiren
        
            mischen(links, mitte, rechts);
            //alles zusammen mischen
        }
    }

Also ich würde die mischen -Methode so kommentieren:
Java:
/**
     * Methode um Elemente eines Arrays zu sortieren.
     *
     * @param links
     * @param mitte
     * @param rechts
     */
    private void mischen(int links, int mitte, int rechts) {
     
        // Kopiere die Elemente aus array1 in array2
        // damit man array1 also "neues"-sortiertes Array nutzen kann
        for (int i = links; i <= rechts; i++) {
            array2[i] = array1[i];
        }
   
        int i = links;            // i = links = 0; (1.Index d. Arrays )
        int j = mitte + 1;        // j = mitte + 1 (1. Index nach der Hälfte)
        int k = links;            // k = links = 0;
   
   
 
        // Vergleiche die Elemente der linken Seite des Arrays
        // mit den Elementen der rechten Seite des Arrays
        // Bsp:
        //Array:
        //|1|2|2|7|9  |4|6|7|9|9
        // x y z       x y z
        // Es wird also immer x mit x vergleichen, y mit y.. usw
        while (i <= mitte && j <= rechts) {    
           //solange keine der beiden Arrays ganz durchlaufen sind
         
           //   x,y,z        y,y,z
           if (array2[i] <= array2[j]) {
                // wenn das linke Element kleiner ist als das rechte Element
                // schreibe das linke Element in das "neue" - sortierte Array
                array1[k] = array2[i];
                // gehe ein Element im linken Array weiter
                i++;
            } else {
                // wenn das rechte Element kleiner ist als das linke Element
                // schreibe das rechte Element in das "neue" - sortierte Array
                array1[k] = array2[j];
                // gehe ein Element im rechten Array weiter
                j++;
            }
            // erhöhe den Index für das "neue"-sortiere Array, weil die Zahl für
            // den Index ja gefunden wurde.
            k++;
        }
        // Danach würde das Bsp Array also so aussehen:
        // |1|2|2|4|6|7|7|9|9|9
        //
        //
        //
        // Wenn eine der beiden Zählvariablen i oder j am "Ende" ist (d.h. wenn
        // i an der Hälfte angekommen ist bzw j am Ende des Arrays, dann bleibt
        // ein "Rest" an Zahlen übrig die noch nicht kopiert wurden (ins neue Array)
 
        // das zurückkopieren in das neue Array geschiet hier
        while (i <= mitte) {              
           //Rest von links wird durchlaufen
            array1[k] = array2[i];
            k++;
            i++;
        }
   
    }

Vielleicht hilft es ja.

Gruß
Robert
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Dimax RegEx funktionieren nicht Java Basics - Anfänger-Themen 7
B Polymorphie Warum funktionieren polymorphe Referenzvariablen bei überschriebenen Methoden und bei nicht überschriebenen nicht? Java Basics - Anfänger-Themen 3
H Threads funktionieren nicht Java Basics - Anfänger-Themen 4
C GUI- Scrollpane will nicht funktionieren Java Basics - Anfänger-Themen 2
T Klassen wie funktionieren Streams, warum bekomme ich int zurück? Java Basics - Anfänger-Themen 2
F Threads funktionieren auf JPanel nicht Java Basics - Anfänger-Themen 1
M Buttons funktionieren nicht Java Basics - Anfänger-Themen 4
K Compiler-Fehler Programme funktionieren nicht mehr Java Basics - Anfänger-Themen 5
C Erste Schritte Math.sin und Co. funktionieren nicht Java Basics - Anfänger-Themen 5
K Get-Methode will nicht funktionieren Java Basics - Anfänger-Themen 6
M IOTools funktionieren nicht Java Basics - Anfänger-Themen 14
Java-Insel Methoden FileWriter Methoden funktionieren nicht Java Basics - Anfänger-Themen 20
K Threads Nur 2 von 3 Threads funktionieren Java Basics - Anfänger-Themen 8
J Threads funktionieren nicht Java Basics - Anfänger-Themen 10
J Quartz Scheduler beispiele funktionieren nicht Java Basics - Anfänger-Themen 6
S Actionlistener funktionieren nicht in der .jar Java Basics - Anfänger-Themen 9
B Java und Javac funktionieren nicht - bitte hilfe Java Basics - Anfänger-Themen 5
P Datentypen Warum würde dieses Beispiel nicht funktionieren? Java Basics - Anfänger-Themen 6
F Applications funktionieren grundsätzlich nicht. Java Basics - Anfänger-Themen 4
S Schleife möchte nicht funktionieren Java Basics - Anfänger-Themen 5
J Window-Listener funktionieren nicht Java Basics - Anfänger-Themen 7
apple987123 JAR Files Funktionieren nicht Java Basics - Anfänger-Themen 6
P OOP Getter&Setter Methoden funktionieren nicht Java Basics - Anfänger-Themen 7
T Probleme bei einen Stack der über drei Dateien funktionieren soll Java Basics - Anfänger-Themen 5
K Buttons Funktionieren Nicht!!! Java Basics - Anfänger-Themen 8
H Iteratoren funktionieren nicht Java Basics - Anfänger-Themen 4
G Java-Frames funktionieren nach Neuinstallation nicht mehr. Java Basics - Anfänger-Themen 3
hdi bilder funktionieren im jar archiv nicht. Java Basics - Anfänger-Themen 3
T Warum kann Hashtable get Methode nicht funktionieren? Java Basics - Anfänger-Themen 3
T Methoden funktionieren nicht Java Basics - Anfänger-Themen 5
D Wie funktionieren FileReader Java Basics - Anfänger-Themen 6
B in der .Jar funktionieren nicht alle Funktionen Java Basics - Anfänger-Themen 18
megachucky Action-/Change Listener funktionieren nicht. Java Basics - Anfänger-Themen 2
T Pakete und "-cp_ funktionieren net zusammen Java Basics - Anfänger-Themen 2
N Int to String will nicht funktionieren Java Basics - Anfänger-Themen 14
G Methodenaufrufe funktionieren nicht Java Basics - Anfänger-Themen 2
M Arrays clonen mit clone() scheint nicht zu funktionieren Java Basics - Anfänger-Themen 4
P Wie kann diese Schleife beenden Java Basics - Anfänger-Themen 1
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
M Wie kommen diese Ausgaben zustande? Java Basics - Anfänger-Themen 12
W Warum diese Fehlermeldung? Java Basics - Anfänger-Themen 12
berserkerdq2 Habe eine Klasse, welche public ist, diese hat eine public Methode, die nicht static ist. Wenn ich nun versuche aufzurufen Probleme? Java Basics - Anfänger-Themen 8
Alen123 Wie würdet ihr diese Aufgabenstellung lösen? Java Basics - Anfänger-Themen 18
J Hallo zusammen , was macht diese Methode hier genau? Java Basics - Anfänger-Themen 3
Fats Waller Wofür stehen diese Konstanten im Java Labyrinth ? Java Basics - Anfänger-Themen 5
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 2
M Könnte mir jemand diese Aufgabe erklären? Java Basics - Anfänger-Themen 9
dieter000 Wie schreibe ich diese ZEile um? Java Basics - Anfänger-Themen 1
M Objekt mit eindeutiger ID löschen, das nächste Objekt hat dann diese ID Java Basics - Anfänger-Themen 5
J Womit kann ich diese Methode testen? Java Basics - Anfänger-Themen 5
J Hat jemand einen Lösungsansatz für diese Aufgabe? Java Basics - Anfänger-Themen 1
ZH1896ZH Wieso diese Ausgabe?? Java Basics - Anfänger-Themen 10
T Was macht diese Zeile? Java Basics - Anfänger-Themen 9
G Woher kommt diese Eigenschaft Java Basics - Anfänger-Themen 5
O Was tut diese Methode? und wie müssen die assertions aussehen? Java Basics - Anfänger-Themen 21
F Wie implementiere ich diese Aufgabenstellung? Java Basics - Anfänger-Themen 16
F Wie kann ich diese NullPointerException umgehen?! Java Basics - Anfänger-Themen 41
F Warum erhalte ich diese Fehler bei der Einbindung von SQLite JDBC in Eclipse? Java Basics - Anfänger-Themen 1
F Warum verläuft DIESE Schleife endlos? Java Basics - Anfänger-Themen 4
D Was bedeutet diese Schreibweise? Java Basics - Anfänger-Themen 9
A Erste Schritte Bitte helfen sie mir diese Programm zu schreiben Java Basics - Anfänger-Themen 12
W Wie vermerke ich diese Struktogramm Passage in Java Syntax? Java Basics - Anfänger-Themen 8
N Methoden warum wird diese Methode aufgerufen Java Basics - Anfänger-Themen 9
L Input/Output Wieso kommt diese Ausgabe? Java Basics - Anfänger-Themen 12
L Datentypen Date API - diese Woche bestimmen Java Basics - Anfänger-Themen 1
M Aus Datei auslesen und untersuchen ob diese Zeile schon vorhanden ist Java Basics - Anfänger-Themen 3
B Kann mir jemand diese Bedingung erklären Java Basics - Anfänger-Themen 5
B Wie könnte man mit Java diese Matheaufgabe lösen Java Basics - Anfänger-Themen 7
B Wie würdet ihr diese Methode erklären? Java Basics - Anfänger-Themen 2
C Methoden Welche JSoup Methoden Und Parameter für diese HTML Tags Java Basics - Anfänger-Themen 4
kilopack15 Ist diese setter-Methode richtig? Java Basics - Anfänger-Themen 2
B Was macht diese Methode? Java Basics - Anfänger-Themen 9
P Was macht diese methode Java Basics - Anfänger-Themen 2
P Terminieren diese Schleifen Java Basics - Anfänger-Themen 6
U Ist diese Methode zur Matrix Vektor Multiplikation korrekt ? Java Basics - Anfänger-Themen 5
T Zeilen des ListArray nach einem Wort durchsuchen und diese Zeile ausgeben Java Basics - Anfänger-Themen 4
K Methoden mit den Namen accept. Welche Funktion haben diese? Java Basics - Anfänger-Themen 2
X wie kann ich in bluej/java einene 2d array mit zahlen fuellen, so dass sich diese in der der zeilen Java Basics - Anfänger-Themen 2
G Vertsändnisfrage zu Code - Wie kommt diese Ausgabe zustande? Java Basics - Anfänger-Themen 2
J Kann mir bitte mal jemand diese Codes erklären? Java Basics - Anfänger-Themen 19
D Erste Schritte Dynamisch Objekte erzeugen und diese durchsuchen Java Basics - Anfänger-Themen 7
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
A Wieso kann ich nicht auf diese Variable zugreifen? Java Basics - Anfänger-Themen 6
A Erste Schritte Wieso funktioniert diese Klasse nicht Java Basics - Anfänger-Themen 11
H Wie erstelle ich diese Klassen? Java Basics - Anfänger-Themen 44
R Kann jemand diese Java Programmierung machen? Versteh ich leider nicht Java Basics - Anfänger-Themen 17
M Erste Schritte Wie kommt man auf diese Ausgabe? Java Basics - Anfänger-Themen 3
S Methoden Return Anweisung beendet Methode nicht, stattdessen wird diese zweimal durchlaufen Java Basics - Anfänger-Themen 3
SexyPenny90 Wieso ist diese eigene Equals-Methode schlecht? Java Basics - Anfänger-Themen 17
F verstehe diese Variable nicht... Java Basics - Anfänger-Themen 4
B for-schleife - Was tut diese? Java Basics - Anfänger-Themen 11
A Wie kommt diese NullPointerException zustande? Java Basics - Anfänger-Themen 13
D Warum ist diese Interfacedeklaration falsch? Java Basics - Anfänger-Themen 5
T Warum brauche ich diese IOException? Java Basics - Anfänger-Themen 30
R Welche Datenstruktor für diese Liste? Java Basics - Anfänger-Themen 6
B Erste Schritte Welche Kenntnisse brauche ich für diese Programmidee? Java Basics - Anfänger-Themen 4
L Immer diese Arrays Java Basics - Anfänger-Themen 11
H Was macht diese Methode? Java Basics - Anfänger-Themen 3
A was berechnet diese programm? Java Basics - Anfänger-Themen 13
G Was bedeutet diese Zeile? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben