Bubble Sortierung in Java


Goaew

Grünschnabel
Hallo, ich habe hier ein kurzes Java Programm, das mir ein Array mit dem Bubble Algorithmus sortiert. Was mich hier komplett verwirrt ist, das in der Methode sort in der zweiten for-Schleife die länge des Arrays mit minus 1 am ende stehen gelassen wird. Ich verstehe nicht warum man das macht und was das für ein zweck haben soll? Ich habe zum testen in der main mir eine eigene for Schleife geschrieben um mir das einzeln ausgeben zu lassen, jedoch wird dann hier der letzte Eintrag im Array abgeschnitten, hää? Kann mir das vielleicht jemand ganz simple erklären warum das ganze so ist und warum ich in der zweiten for-schleife der sort Methode die minus 1 dran hängen muss? Ich verstehe auch nicht wieso ich in der ersten for-Schleife der sort Methode j=1 setze?, ich weiss das ich die Liste einmal komplett durchlaufen muss aber das Array beginnt doch bei 0? Danke schon mal im Voraus!





Java:
    public static void main(String[] args) {

        int[] a = {3, 5, 0, 2, 1, 4};
    
        for(int i = 0; i<a.length-1; i++){
            System.out.println(a[i]);
        }
    }

    public static int[] sort(int[] a) {
        for (int j = 1; j < a.length; j++) {
            for (int i = 0; i < a.length - 1; i++) {
                if (a[i] > a[i + 1]) {
                    int tmp = a[i];
                    a[i] = a[i + 1];
                    a[i + 1] = tmp;
                }
            }
        }

        return a;
    }
 

ikosaeder

Teekannen-Agnostiker
Also so wie ich das sehe, könntest du in der ersten Schleife genauso j=0;j< a.length -1 schreiben. Das ist equivalent, da du j ja nicht verwendest. Aber ich denke da sollte <= stehen.
Wenn das Array 6 Elemente lang ist, dann läuft die Schleife von 0 bis 4 wenn du j =0, j < a.length -1 schreibst.
Dementsprechend gibt die for-Schleife vorher auch ein Element weniger aus.
 

Sempervivum

Erfahrenes Mitglied
Mir scheint, diese Frage ist noch nicht beantwortet:
warum ich in der zweiten for-schleife der sort Methode die minus 1 dran hängen muss?
Der Grund ist diese Anweisung in der inneren Schleife:
if (a[i] > a[i + 1]) {
D. h. es wird auf ein Element mit dem Index i+1 zugegriffen, daher muss i maximal auf das vorletzte Element zeigen, damit i+1 auf das letzte zeigt.

BTW: Den Algorithmus kann man noch optimieren, denn es kann sein, dass das Array schon vollständig sortiert ist, bevor die äußere Schleife fertig ist. Also eine Hilfsvariable auf true setzen, wenn eine Vertauschung statt gefunden hat und die äußere Schleife vorzeitig beenden, wenn dies nicht der Fall ist.
 

Goaew

Grünschnabel
Mir scheint, diese Frage ist noch nicht beantwortet:

Der Grund ist diese Anweisung in der inneren Schleife:
if (a[i] > a[i + 1]) {
D. h. es wird auf ein Element mit dem Index i+1 zugegriffen, daher muss i maximal auf das vorletzte Element zeigen, damit i+1 auf das letzte zeigt.

BTW: Den Algorithmus kann man noch optimieren, denn es kann sein, dass das Array schon vollständig sortiert ist, bevor die äußere Schleife fertig ist. Also eine Hilfsvariable auf true setzen, wenn eine Vertauschung statt gefunden hat und die äußere Schleife vorzeitig beenden, wenn dies nicht der Fall ist.
Danke!
 

zerix

Hausmeister
Moderator
Hallo,

j fängt bei 1 an, weil es einfach nur die
Also so wie ich das sehe, könntest du in der ersten Schleife genauso j=0;j< a.length -1 schreiben. Das ist equivalent, da du j ja nicht verwendest. Aber ich denke da sollte <= stehen.
Wenn das Array 6 Elemente lang ist, dann läuft die Schleife von 0 bis 4 wenn du j =0, j < a.length -1 schreibst.
Dementsprechend gibt die for-Schleife vorher auch ein Element weniger aus.

In der sort Methode ist das richtig so, weil du einen Durchgang weniger als Elemente im Array benötigst, um das Array zu sortieren. Beispielsweise bei 2 Elementen, brauchst du nur einen Durchgang.

Viele Grüße
Sascha
 

Neue Beiträge