Java Bubble Sort Algorithmus programmieren wer kann mir helfen (bitte keine Lösung schreiben sondern nur Tipps geben)?

5 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Tipp 1: Du setzt beim dritten Element an. Die Variable i hat den Wert 1, die Inkrementation erhöht auf 2.

Tipp 2: Wenn du den Wert von a[i] nimmst und in a[i - 1] speicherst, haben beide Elemente denselben Wert. Folgend a[i - 1] in a[i] zu schreiben, bringt nicht mehr viel.

Nochmal zur grafischeren Visualisierung:

a[0] = 4
a[1] = 2

swap:
a[0] = a[1] >> a[0] hat nun den Wert 2
a[1] = a[0] >> a[1] ändert sich nicht, ist nach der Zuweisung immer noch 2

Du solltest dir den Wert von a[0] zwischenspeichern, bevor du ihn überschreibst und diese temporäre Variable später a[1] zuweisen.


Nichtsnutz12 
Beitragsersteller
 31.05.2019, 19:48

ok danke hab deine beiden tipps befolgt es klappt fast ja kannst du nochmal drüber schauen ich hab beide werte zur Sicherheit in einer eigenen Variable zwischengespeichert die unteren 2 Fälle mit minus zahlen klappen nicht ich weiß nicht wieso

https://ibb.co/LJfyVVG

regex9  31.05.2019, 20:20
@Nichtsnutz12

Der Ablauf deines Programmes (ab der Schleife) sieht bei einer Beispielmenge [-3, -4, -5, -2] derzeit so aus:

i++ >> i = 1
-4 < -3 >> true, neue Reihenfolge ist: [-4, -3, -5, -2]
1 < 3 >> true

i++ >> i = 2
-5 < -3 >> true, neue Reihenfolge ist: [-4, -5, -3, -2]
2 < 3 >> true

i++ >> i = 3
-2 < -3 >> false, Reihenfolge der Elemente bleibt
3 < 3 >> false

Das bedeutet, deine Methode bubbelt nur einen Wert nach hinten, denn es findet nur ein Durchlauf durch die Liste statt. Es sollte aber mehrere Durchläufe geben. So oft, bis alle Elemente an der richtigen Stelle stehen.

Schau dir dazu die Animation von Wikipedia an (auch wenn sie langsam ist). Jeder Durchlauf durch die Menge ermittelt durch paarweise Vergleiche den größten/kleinsten Wert und sortiert ihn an das Ende/den Anfang der Liste. Nach einem Durchlauf verringert man den Mengenbereich, den man sich anschauen möchte (der zuvor gebubbelte Wert am Anfang/Ende der Liste ist ja nun korrekt sortiert) und iteriert über diesen.

Mit jedem Durchlauf wird ein Wert richtig sortiert und der Mengenbereich verkleinert sich, bis man nur noch ein Element übrig hat. Dieses muss zwangsweise an seiner richtigen Stelle stehen.

du brauchst eine temporäre variable zum tauschen ...

a = b

b = a

vertauscht nicht a und b, sondern setzt a und b auf den selben wert den b am anfang hatte, das wolltest du ja nicht ---- also:

temp = a

a = b

b = temp

weiterer tipp. bubblesort geht mit 2 ineinander verschachtelten schleifen (eben 2 verschiedene laufvariablen)

for i = 1 to n-1: for j = i to n.

Du benötigst zwei for-Schleifen und eine if-Abfrage.


Nichtsnutz12 
Beitragsersteller
 30.05.2019, 18:27

ok aber da steht while do schleife geht das auch mit 2 while do schleifen?

tom1stein  31.05.2019, 08:16
@Nichtsnutz12

Bitte 30 Sekunden nachsitzen und den Kopf einschalten!

Was ist eine FOR-Schleife? Die beginnt bei einem Anfangswert und zählt ab da eigenständig weiter. Sie endet, wenn ein Endwert erreicht ist. Mathematisch endet sie also, wenn der Schleifenwert größer oder gleich dem Endwert ist. Richtig?

Was ist eine WHILE-Schleife? Sie läuft, bis eine Bedingung erreicht ist. Das kann die gleiche Bedingung wie bei der FOR-Schleife sein. Nur den Anfangswert initialisieren und den Schleifenwert erhöhen macht sie nicht automatisch, das muss man also selbst hinzufügen.

Übrigens: Man kann hier auch Quellkode direkt einfügen. Das lässt sich besser lesen und spart Bytes.

Nichtsnutz12 
Beitragsersteller
 31.05.2019, 12:58
@tom1stein

Wo hab ich was anderes behauptet 😂😂😂👌🏻👌🏻👌🏻

Was ist das eigentlich für eine Seite?


Nichtsnutz12 
Beitragsersteller
 30.05.2019, 18:24

Meine Uni Seite wo wir halt Online Aufgaben vom Dozenten zum Üben bekommen haben.

Nichtsnutz12 
Beitragsersteller
 30.05.2019, 18:27
@verreisterNutzer

nicht bei jeder, nur die die ich nicht verstehe, und hab ja extra gesagt keine Lösung tippen nur Tipps geben

Wie sieht denn dein Ansatz aus? Ansonsten wäre mein Tipp, dass du erstmal den Pseudocode von Wikipedia in Java übersetzt.

https://de.wikipedia.org/wiki/Bubblesort#Algorithmus


Nichtsnutz12 
Beitragsersteller
 30.05.2019, 18:25

Siehe Foto da ist mein Ansatz

bluebird5  30.05.2019, 18:45
@Nichtsnutz12
a1[i-1] = a1[i];
a1[i] = a1[i-1]

Damit willst du wahrscheinlich die beiden Werte vertauschen. Das klappt so allerdings nicht, nach der ersten zitierten Zeile hat a1[i-1] den gleichen Wert wie a1[i]. Und den selben Wert schreibst du dann nochmal in a1[i], am Ende deiner "Vertauschaktion" sind die Werte nicht vertauscht, sondern haben beide den gleichen Wert (das müsste der von a1[i] sein). Da brauchst du eine Zwischenvariable. Irgendwas in Richtung

int temp = a1[i - 1];
a1[i - 1] = a[i];
a[i] = temp;

Ansonsten gilt das, was milos2 schreibt (und was auch bei Wikipedia steht) - du brauchst zwei verschachtelte Schleifen.