# BubbleSort Anzahl der Vertauschungen



## Soloeco (26. Nov 2016)

Hallo,
ich habe eine kleine Frage zum Thema BubbleSort. Und zwar habe ich ein Array mit 100 zufälligen Zahlen, aus dem Zahlenbereich 1 bus 1000, die ich sortiert ausgeben möchte. Dazu habe ich verschiedene Sortierverfahren bereits geschrieben, die auch soweit funktionieren und auch bubbleSort funktioniert. Doch nun möchte ich mir zusätzlich zu dem sortierten Array die Anzahl der Vertauschungen ausgeben lassen nur irgendwie wird die Variable nicht hochgezählt. Als Ergebnis bekomme ich immer 0 bei der Anzahl der Vertauschungen.

Hier mein Code zum BubbleSort (Nehme auch gerne Verbesserungsvorschläge generell zum Code):


```
public void bubbleSort(int[] array) {
        bubbleArray = array;
        int vertauschungen = 0;
        int n = bubbleArray.length;
        do {
            int m = 1;
            for(int i = 0; i < n - 1; i++) {
                if(bubbleArray[i] > bubbleArray[i + 1]) {
                    int temp = bubbleArray[i];
                    bubbleArray[i] = bubbleArray[n];
                    bubbleArray[n] = temp;
                    vertauschungen++;
                    m = i + 1;                 
                }
            }
            n = m;
        } while (n > 1);
       
        for(int x = 0; x < bubbleArray.length; x++) {
            System.out.print(bubbleArray[x] + " | ");
        }
        System.out.println("Anzahl der Vertauschungen: " + vertauschungen);
    }
```

Würde mich freuen wenn mich jemand aufklären kann woran das liegt. Sitze da bereits einige Zeit dran.
Freundlich Grüße


----------



## Kababär (26. Nov 2016)

Dein Code scheint nicht ganz zu funktionieren.
Probiere es mal mit folgenden Daten:

```
int[] arr = new int[]
        { 3, 4, 1, 2, 6, 11, 20, 12 };
```

Ich für meinen Teil bekomme dann:


> Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 8
> at sotz.BubbleSort.bubbleSort(BubbleSort.java:28)
> at sotz.BubbleSort.main(BubbleSort.java:12)



Denn
int n = bubbleArray.length;
müsste
int n = bubbleArray.length - 1;
heißen.
Dennoch ist mein Feld unsortiert:


> 3 | 12 | 1 | 2 | 6 | 11 | 20 | 4 | Anzahl der Vertauschungen: 1



Edit: Der Fehler lag daran, dass du die falschen Bedingungen geprüft hast. 
So sollte es funktionieren:

```
if (bubbleArray[i] > bubbleArray[i + 1])
                {
                    int temp = bubbleArray[i];
                    bubbleArray[i] = bubbleArray[i + 1];
                    bubbleArray[i + 1] = temp;
                    vertauschungen++;
                    m = i + 1;
                }
```

Dein n ist zu groß. Es ist ja die Länge deines Arrays -1, also das letzte Element, was du immer tauschen willst. Aber du willst ja nur das nächste Element mit dem jetzigen tauschen.


----------



## Soloeco (26. Nov 2016)

Also ich habe jetzt ausprobiert mit der Länge, also das hier:


Kababär hat gesagt.:


> int n = bubbleArray.length;
> müsste
> int n = bubbleArray.length - 1;


und ich habe das aus deinem Edit auch probiert und auch beides in Kombination. Ich bekomme nie eine Fehlermeldung, mein Array ist sortiert so wie es soll nur immer noch nicht werden die Vertauschungen ausgegeben. Die Variable vertauschungen bleibt 0.

Das hier habe ich jetzt:


```
public void bubbleSort(int[] array) {
        bubbleArray = array;
        int vertauschungen = 0;
        int n = bubbleArray.length - 1;
        do {
            int m = 1;
            for(int i = 0; i < n - 1; i++) {
                if(bubbleArray[i] > bubbleArray[i + 1]) {
                    int temp = bubbleArray[i];
                    bubbleArray[i] = bubbleArray[i + 1];
                    bubbleArray[i + 1] = temp;
                    vertauschungen++;
                    m = i + 1;                 
                }
            }
            n = m;
        } while (n > 1);
       
        for(int x = 0; x < bubbleArray.length; x++) {
            System.out.print(bubbleArray[x] + " | ");
        }
        System.out.println("Anzahl der Vertauschungen: " + vertauschungen);
    }
```


----------



## DrZoidberg (26. Nov 2016)

Wahrscheinlich rufst du die Methode nie auf. Du verwendest stattdessen eine andere. Hast du vielleicht zwei "bubbleSort" Methoden?
Übrigens war "int n = bubbleArray.length;" schon korrekt. n ist die Anzahl der Zahlen in deinem Array, die noch nicht sortiert sind, und nicht der Index der letzten Zahl.


----------



## Soloeco (26. Nov 2016)

Die Methode rufe ich schon auf, in einer zweiten Klasse die ich zum Ausgeben des Arrays habe. Da kommt auch der sortierte Array bei heraus. Das einzige Problem dass ich nun habe ist, dass aus welchem Grund auch immer die Variable vertauschungen nicht hochgezählt wird, die bleibt immer 0.


----------



## JStein52 (26. Nov 2016)

Dann bleibt nur noch dass er tatsächlich nichts vertauscht


----------



## Soloeco (26. Nov 2016)

Aber das Array wird ja sortiert ausgegeben. Wie ich in meinem ersten Post geschrieben habe, habe ich auch noch zwei andere sortier verfahren, die bereits funktionieren. Dort habe ich den gleichen Array sortieren lassen und dabei werden Vertauschungen benötigt. Fazit: Ein Array, bei zwei Variaten werden vertauschungen benötigt, heißt also bei der dritten müsste dies auch der Fall sein


----------



## JStein52 (26. Nov 2016)

Dann geh mal mit dem Debugger durch oder bau in den Vertauschungszweig ein println ein !


----------



## JStein52 (26. Nov 2016)

Soloeco hat gesagt.:


> Dort habe ich den gleichen Array sortieren lassen und dabei werden Vertauschungen benötigt.


Wenn du das Array vorher schon sortieren lässt dann gibt es ja auch nichts mehr zu sortieren/vertauschen


----------



## Soloeco (26. Nov 2016)

Danke, habe endlich die Lösung! @JStein52  du hast Recht. Ich hatte dummerweise einen Array den ich dann sortiert habe und dann mit den anderen beiden Sortierverfahren nocheinmal sortieren wollte. Habe jetzt den Ausgangsarray in drei einzelne temporäre arrays gepackt die ich dann jeweils mit den verschiedenen Verfahren sortiere. Dein Hinweis mit dem println im Vertauschungszweig hat mich letztendlich auf die Lösung gebracht. Danke nocheinmal


----------

