Kann mir jemand diesen Java-Code für das Bubble Sort Verfahren erklären?

7 Antworten

da Du offensichtlich erst mal die Basics von java brauchst, hier eine sehr kurze Definition der Zeilen. Du solltest aber unbedingt nochmal ganz von vorne anfangen, und ein Lehrbuch zur Hand nehmen. Um code zu verstehen sollte das schon "drin" sein...

boolean unsortiert=true;

definiert eine lokale Variable mit Namen "unsortiert", und mit Typ "boolean" und gibt ihr den initialen Wert "true".

int tmp;

definiert eine weitere lokale Variable, mit default Wert. (0 bei int).

boolean sind die logischen Werte true/false;
int sind ganze Zahlen (Wertebereich -2^31..2^31-1).

while (bedingung) { anweisungen }

solange "bedingung" gleich true ist, werden alle Anweisungen in den geschweiften Klammern wiederholt.
ACHTUNG: eigentlich kommt hinter "while" (oder "for" oder "if") nur eine Anweisung. Das heisst, "while" wiederholt eine Anweisung, solange die Bedingung erfüllt ist.
ABER: mit "{"..."}" kann man mehrere Anweisungen zu einem Block zusammenfassen, und die gelten dann wie eine Anweisung hinter "while", "for", "if" etc.
Dazu solltest Du dir nochmal die Syntax (Gramatik) der Sprache Java anschauen (Lehrbuch).

Da hinter dem "while" ein Block mit mehreren Anweisungen kommt, werden alle darin nacheinander in der Schleife ausgeführt.

unsortiert = false;

sollte klar sein.

for (int i=0; i < x.length-1; i++)

eine weitere lokale Variable "i" mit Typ "int" wird definiert, und die nachfolgende Anweisung mit mehrmals durchlaufen, wobei "i" nacheinander die Werte 0..x.length-1 annimmt. Die 3 Ausdrücke in der "for"-Anweisung sind initializer, test und increment. "for (initializer; test; increment) anweisung" bedeutet nichts anderes als:

initializer;
while (test) {
   anweisung;
   increment
}

Beachte: hinter dem "for" kommt keine geschweifte Klammer. Es wird also nur eine Anweisung in der "for"-Schleife mehrfach ausgeführt. Die eine Anweisung ist das "if", das aber seinerseits (->Block) im true-zweig mehrere Anweisungen in einem Block hat.

Also immer merken: mit geschweiften Klammern macht man einen Block, der für das "while", "for", "if" usw. wie eine einzelne aussieht.
Wenn Du die geschweiften Klammern vergisst, wird (auch wenn es nett eingerückt ist) nur eine Anweisung ausgeführt (ein häufiger Anfängerfehler).
Ich empfehle daher immer geschweifte Klammern zu schreiben, auch wenn man nur eine einzige Anweisung in einer Schleife hat (der code wäre mit "{" in der "for"-Schleife m.E. schöner...)

Das "if" sollte klar sein: zwei aufeinanderfolgende Elemente werden aus dem Array gelesen, und verglichen. "i" ist der Index (der ja von 0 bis 2-vor-der-Länge läuft).

Die Anweisungen im "if" tauschen die beiden Elemente im Array aus, wenn das erste größer ist als das zweite.
UND (wichtig): unsortiert wird wieder auf "true" gesetzt.
Beachte nochmal, daß alle Anweisungen zum Austauschen und setzen von "unsortiert" in einem Block stehen.

Was macht das ganze?

Nehmen wir zuerst einmal an, der Array wäre schon sortiert.
Dann läuft die "while"-Schleife an, setzt "unsorted" auf false, und geht das ganze Array einmal durch, und schaut, ob da zwei Elemente in falscher Reihenfolge vorkommen. In diesem Fall (bereits sortiert) findet es kein solches Paar.
Am Ende der "for"-Schleife ist also "unsortiert" immer noch "false", und es gibt keinen zweiten Durchlauf der "while" Schleife. Fertig.

Fall 2: angenommen, die innere "for"-Schleife findet so ein "falsches Paar". Dann werden die beiden ausgetauscht, so daß jetzt das kleinere Element an index "i", und das größere an "i+1" zu liegen kommt. Und: es wird "unsorted" auf true gesetzt.
Das heisst, daß am Ende ein paar Elemente um einen Platz nach "unten" gerutscht sind. Da das aber nicht unbedingt reicht (weil u.U. Elemente noch viel weiter rutschen müssen), wird die "while"-Schleife nochmal durchlaufen. Wieder beginnend ab Index 0. Das passiert solange, bis kein "falsches Paar" mehr gefunden wurde. Dann ist das Array sortiert.

Beispiel:

0,9,4,6,2,8,5,1,7,3

nach erstem Durchlauf:

0,4,6,2,8,5,1,7,3,9

nach 2. Durchlauf:

0,4,2,6,5,1,7,3,8,9

nach 3. Durchlauf:

0,2,4,5,1,6,3,7,8,9

nach 4. Durchlauf:

0,2,4,1,5,3,6,7,8,9

5. Durchlauf:

0,2,1,4,3,5,6,7,8,9

6. Durchlauf:

0,1,2,3,4,5,6,7,8,9

7. Durchlauf:

0,2,1,4,3,5,6,7,8,9

kein Austausch mehr.

So, jetzt tun mir die Finger weh. Ich hoffe alles ist jetzt klarer.

boolean ist kein Befehl, sondern ein Datentyp, ein Wahrheitswert, der kann ja oder nein sein (englisch true oder false)

In der Funktion "sortiere()" wird der Wahrheitswert "unsortiert" auf true gesetzt, denn sonst wäre die Funktion sofort abgearbeitet, weil sie genau so lange läuft, bis unsortiert = false ist, also alles korrekt sortiert ist.

Die Integerwert-Liste besteht aus 10 Elementen (Ziffern), in Java hat das erste Element immer den Index 0. Es gibt also die Elemente liste[0]...liste[9].

Solange der Zähler i < 9 wird i incrementiert, also um 1 erhöht und dann geguckt, ob das Element i größer ist als das folgende Element i+1, denn in dem Fall muss das Element i+1 an die Stelle des Elementes i. Die Integervariable "temp" wird als Zwischenspeicher benutzt, um sich den Wert vom Element i zu merken, weil es ja mit dem Wert vom Element i+1 überschrieben wird.

Diese Schleife wird nun 10x durchlaufen, danach stehen alle Elemente in der korrekt sortierten Reihenfolge im Integerarray "liste" und werden jetzt nur noch mit je einem Leerzeichen getrennt am Bildschirm angezeigt.

Ich hoffe, du hast ein wenig vertanden...

21

Hey, danke für die ausführliche Antwort. Sorry wenn ich mich zu doof anstelle, aber kannste mir diese 4 if-Bedingungen nochmal einzelt erklären?

 1. temp = x[i];
2. x[i] = x[i+1];
3. x[i+1] = temp;
4. unsortiert = true;

Das Prinzip verstehe ich. Ist ja recht simpel. Aber anhand des Codes nicht...

0
34
@iParadox15

Die beiden Variablen werden getauscht (dafür braucht man die temporäre Variable)

1
41
@iParadox15

Klar, das sind keine 4 if-Bedingungen, sondern wenn die if-Bedingung erfüllt ist, also 

x[i] > x[i+1] = true,

dann werden diese 4 Zuweisungen abgearbeitet:

1. Merke den Wert von x[i] in der Variablen temp

2. Schreibe den Wert von x[i+1] in das Element x[i]

3. Übergebe den in temp zwischengespeicherten Wert an x[i+1]

4. Setze unsortiert wieder auf true, denn wir sind noch nicht fertig.

1

Was bedeutet der Befehl "boolean"?

Boolean ist eine Datentyp. Im Deutschen würde man das als "Wahrheitswert" bezeichnen (der Wertebereich ist wahr oder falsch).

Was meint man mit int temp?

Das ist der Name einer temporären Variable

21

Danke, so eine Antwort brauch ich. :) Kannst Du mir noch das mit der while-Schleife innerhalb davon eine for-Schleife mit if Bedinungen erklären? Ich habe kenne das nur mit for-Schleife und innerhalb davon if-Bedingungen. Bedeutet das, dass es solange wiederholt wird, bis das Array sortiert wurde?

0
34
@iParadox15

- Die if-Abfrage überprüft, ob die aktuelle Zahl größer als die Folgende ist. In dem Fall werden die Zahlen dann vertauscht.

- Die for-Schleife dürchläuft das Array.

- Die While Schleife läuft solange, wie das Array unsortiert ist

1

Wie löse ich die Javaaufgabe für den goldenen Schnitt?

Hallo liebe Community,

ich habe folgendes Problem: Ich muss eine Javaaufgabe lösen, welche diesen mit konvergenz berechnet. Die vorgegeben Formel lautet wie folgt: g = 1 + 1/g = 1+1/1+1/g = ... Für g wird quasi immer 1+1/g eingesetzt. Mir wird ein Parameter übergeben, welcher bestimmt, wie oft die Abfolge berechnet werden soll. Bei meinem Programm kommt es aber immer wieder zu minimalsten Abweichungen bei der 3.-5. Nachkommastelle und ich weiß nicht wie ich diese Abweichungen beseitigen kann.

Hier noch der bisherige Code:

public class GoldenRatio {

    public static double result;
    public static double result2;
public static double calculate(int n) {
    
    if(n==0){
        return 0;
    }
    for(int i=0;i<=n;i++){
        result = 1+ 1/result;
    }
    return result;
}

}

Ich hoffe ihr könnt mir da irgendwie weiterhelfen.

Viele Grüße Dubsepp

...zur Frage

java Matrix als klasse (array)?

Hallo.

Ich muss eine Klasse erstellen die ein Zweidimensionales Array kreiert.

Hier ist die klasse.

public class Matrix {

int columns;
int rows;


Matrix(){
}

public Matrix(int rows, int columns){
    Matrix [][] marray = new Matrix[columns][rows];
}

}

Und das ist meine Mainmethode.

public class Matrizen { public static void main(String[]args){ int reihe=5; int saule=5;

    Matrix marray = new Matrix(reihe,saule);
    
    for (int i=0; i<3; i++){
        System.out.println(marray);
    }
}

}

Aber ich kriegs nicht zum laufen. Das Problem scheint beim aufrufen der Klasse zu sein. Der Compiler sagt er kann nicht in Arrays auflösen. Sondern in Matrix. Und wenn er in Matrix macht, klappts aber ich habe irgendwie kein richtiges Array.

...zur Frage

ich soll ein Würfel 6000000 würfeln und die Werte in einem Array speichern aber wie (totaler Java Anfänger)?

Ich soll ein Programm schreiben, dass 6000000x Zahlen zwischen 1 und 6 zufällig würfelt und in einem Array speichert ... Da ich totaler Anfänger bin und mir das Internet auch nicht weiter helfen konnte versuch ich es nun hier mehr als (siehe folgenden Anfang) habe ich nicht =/ : public class Wuerfel {

public static void main(String[] args)
{
    // TODO Auto-generated method stub

    int zahl=(int)((Math.random()*6)+1);

    for (int i=0; i<=6000000; i++)
    {
    }

}

}

...zur Frage

Was möchtest Du wissen?