SelectionSort ; Code erläutern

Guten Tag allerseits, wir haben in einem kleinen Kurs jeweils einen Code bekommen den wir mit Kommentaren versehen sollen und ihn dann dementsprechend erläutern sollen. Ich habe einen Code des selectionsortalgorithmus bekommen und weiß an einigen Stellen nicht was die Commands bedeuten. Ich wäre sehr dankbar wenn ihr mir die Zeilen, die mit "//?"versehen sind kurz deuten könntet.

Java:
public class SelectionSort {
  public static void main(String[] args) {
    int[] unsortiert = {4,1,6,5,2,7,3,9,8};                                  
    printArray(unsortiert, "Unsortiert: ");                                    
    selectionSort(unsortiert);                                    //?
    printArray(unsortiert, "Sortiert: ");
  }
  public static void selectionSort(int[] unsortiert) {            //?
    for (int i = 0; i < unsortiert.length; i++) {
      int kleinsteZahl = i;
      for (int j = i + 1; j < unsortiert.length; j++) {
        if (unsortiert[j] < unsortiert[kleinsteZahl]) {
          kleinsteZahl = j;
        }
      }
        if (kleinsteZahl != i) {
        int tmp = unsortiert[i];
        unsortiert[i] = unsortiert[kleinsteZahl];
        unsortiert[kleinsteZahl] = tmp;
      }
    }
  }
  public static void printArray(int[] unsortiert, String msg) {   //?
    System.out.print(msg);                                        //?
      for (int i : unsortiert) {
      System.out.print(i + "| ");
    }
  System.out.println();
  }
}
 
Zuletzt bearbeitet:
Hm, und wir sollen jetzt Zeile für/um Zeile kommentieren?

Also Allgemeines, selectionsort kann man sich wie ein Kartenspiel vorstellen, es wird wiederholt die kleinste oder größte Karte gewählt und ans Ende oder an den Anfang verschoben, zum Schluẞ ist das ganze Kartenspiel sortiert.

Hilft das dem Verständnis schon?

"Ich kann die Syntaxregeln nicht." - Dabei kann ein Forum nur bedingt helfen... a = b; ist zum Beispiel eine Zuweisung von b an a. Das alles zu erklären dauert sehr lange.
 
Das einzige was mir dazu einfallen würde wäre, dass das oben erstellte Array quasi in selectionSort "kopiert" wird
Das ist für den Anfang schon nicht schlecht: tatsächlich wird die Methode selectionSort aufgerufen und als Parameter wird eine Referenz auf das Array übergeben. Die Methode liefert keinen Rückgabewert (void). Trotzdem ist nach der Ausführung das Array sortiert.

Erkläre, warum das funktioniert.
 
Das ist für den Anfang schon nicht schlecht: tatsächlich wird die Methode selectionSort aufgerufen und als Parameter wird eine Referenz auf das Array übergeben. Die Methode liefert keinen Rückgabewert (void). Trotzdem ist nach der Ausführung das Array sortiert.

Erkläre, warum das funktioniert.
Ah ok also wir haben eine Methode selectionSort erstellt. Diese wird aufgerufen und das Array wird durchlaufen. Zuerst wird das allererste Element als kleinsteZahl gesetzt und daraufhin läuft erneut eine weitere Schleife durch, die überprüft ob ein kleineres Element vorhanden ist. Wird ein kleineres Element gefunden, so wird es als kleinsteZahl gesetzt und direkt mithilfe der Zwischenvariable tmp mit der vorher gewesenen kleinsten Zahl vertauscht (Hoffe ich konnte es verständlich erklären). Kannst du das bitte erstmal korrigieren oder bestätigen bevor ich sonst weiter falsches Zeug rede? :D
 
Das ist m.E. in Ordnung, aber die Erklärung geht an meiner Frage vorbei :)

Ich stelle sie mal anders:
Java:
public class Test {
        public static void increaseInt(int a) {
            a++;
        }

        public static void increaseArray(int[] a) {
            a[0]++;
        }
        public static void main(String[] args) {
            int x = 5;
            increaseInt(x);
            System.out.println("Fall 1: " + x);

            int[] y = {5};
            increaseArray(y);
            System.out.println("Fall 2: " + y[0]);
        }
}
Warum liefert increaseInt nicht das gewünschte Ergebnis, increaseArray aber schon?
 
Beispielsweise die Zeile des letzten Kommentars System.out.print(msg); wieso diese z.B. notwendig ist
Hast du die Möglichkeit den Code auszuprobieren?

Dann lass die Zeile doch einfach weg (oder kommentiere sie aus).

Ansonsten ist auch "printArray" nur eine weitere Methode, diesmal mit zwei Parametern. Der erste ist eine Referenz auf ein Array und der andere ein String. Dieser String wird mit der von dir genannten Anweisung ausgegeben. In der "main()" wird die Methode "printArray" zwei mal aufgerufen und was steht jeweils in diesem Parameter?

Edit:

Der Name des "int[]"-Parameters ist allerdings ziemlich unglücklich gewählt.
 
Hast du die Möglichkeit den Code auszuprobieren?
Ja, das ist der Output mit der Zeile:
Java:
Unsortiert: 4| 1| 6| 5| 2| 7| 3| 9| 8|
Sortiert: 1| 2| 3| 4| 5| 6| 7| 8| 9|
Und hier ist der Output ohne die Zeile:
Java:
4| 1| 6| 5| 2| 7| 3| 9| 8|
1| 2| 3| 4| 5| 6| 7| 8| 9|
Also stimmt schon, war mein Fehler die Zeile wäre garnicht mal so notwendig gewesen.
Der erste ist eine Referenz auf ein Array und der andere ein String. Dieser String wird mit der von dir genannten Anweisung ausgegeben.
Stimmt das macht natürlich Sinn. Danke!
 
Danke für die Antworten, ich glaube ich hab's soweit verstanden :) Ich würde aber interessehalber gerne trotzdem wissen warum hier nur increaseArray den "korrekten" Wert ausgibt
Java:
public class Test {
        public static void increaseInt(int a) {
            a++;
        }

        public static void increaseArray(int[] a) {
            a[0]++;
        }
        public static void main(String[] args) {
            int x = 5;
            increaseInt(x);
            System.out.println("Fall 1: " + x);

            int[] y = {5};
            increaseArray(y);
            System.out.println("Fall 2: " + y[0]);
        }
}
 
Danke für die Antworten, ich glaube ich hab's soweit verstanden :) Ich würde aber interessehalber gerne trotzdem wissen warum hier nur increaseArray den "korrekten" Wert ausgibt
Die Frage impliziert, dass Du es noch nicht verstanden hast :)

Java übergibt Parameter immer als Kopie des betreffenden Werts. Bei sog. primitiven Typen (byte, short, int, long, float, double, char) wird tatsächlich einfach der Wert kopiert. D. h. im Beispiel ist increaseInt(x) ist identisch zu increaseInt(5). Der Parameter a ist dann einfach die Zahl 5. Mit der kannst Du in increaseInt anstellen, was Du willst: da es nur eine Kopie ist, wirkt sich das auf x nicht aus.

Bei komplexen Typen (Objekte - ein Array ist in Java auch nur ein Objekt) wird auch eine Kopie übergeben, aber nicht des Objekts selbst, sondern nur eine Kopie der Referenz (=Adresse des Objekts im Speicher). Daher verweisen y und der Parameter a in increaseArray auf das selbe(!) Objekt. D. h. a[0]++ in increaseArray erhöht tatsächlich das selbe(!) Element, also y[0].

Um das mal bildlich zu verdeutlichen, die beiden Fälle:
1. ich schreibe auf einen Zettel eine Zahl, gebe Dir eine Kopie des Zettels und jetzt kannst Du mit dem Zettel (der Zahl) machen, was Du willst: es wird sich auf meinen Zettel nicht auswirken.

2. ich hänge eine Bestell-Liste auf. Jetzt schreibe ich auf einen Zettel: "Erhöhe die Anzahl der Bestell-Liste", diesen Zettel kopiere ich und gebe ihn Dir. Jetzt hast Du keine Kopie der Liste sondern nur eine Kopie der Referenz auf diese Liste bekommen. Du weißt also, wo die "Bestell-Liste" zu finden ist und änderst sie. Da wir beide von der selben(!) Bestell-Liste reden, hat sich tatsächlich die selbe Liste geändert.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben