Seite 1 von 1

Bubble sort

Verfasst: Donnerstag 16. Dezember 2021, 14:23
von Sophie2112
Hallo,
Ich muss eine Bubble sort programmieren, die eine unsortierte Liste von klein nach groß sortiert. Wir haben folgendes Schema vorgegeben:
Algorithmus Bubblesort
Übergabe: Liste
unsortierter Bereich ist zunächst die gesamte Liste
solange der unsortierte Bereich noch mehr als ein Element hat
durchlaufe den unsortierten Bereich von links nach rechts
Wenn 2 benachbarte Elemente in der falschen Reihenfolge vroliegen:
vertausche die beiden Elemente
verkürze den unsortierten Bereich durch weglassen des letzten Elements
Rückgabe: überarbeitete Liste

Ich hatte schon einen Ansatz, jedoch komme ich einfach nicht weiter

def Bubblesort (L,z):
b=0
x=0
länge=len(L)- z
i1=-1
i2=0
while länge-b > 0:
i1=i1+1
i2=i2+1
if L[i1]>L[i2]:
L[i1]=x
L[i1]=L[i2]
L[i2]=x
b=b+1
Bubbesort(L,z+1)

unsortiert=[21, 6, 24, 10, 11, 7, 19]
Bubblesort(unsortiert,0)



Ich bedanke mich schonmal im vorraus für eure Hilfe :)

Re: Bubble sort

Verfasst: Donnerstag 16. Dezember 2021, 15:34
von Sirius3
Funktionen schreibt man wie Variablennamen komplett klein (bubblesort); man benutzt keine einbuchstabigen Variablennamen, weil die einem keine Information liefern, für was die eigentich da sind. `z` zum Beispiel, keine Ahnung, warum das da ist.
Was dann zuerst auffällt sind die falschen Einrückungen, da bekomme ich einen IndentationError, den Du einfach beheben kannst.
Dann wird immer mit 4 Leerzeichen pro Ebene eingerückt, und nicht mal 6 und mal 4.
b, i1 und i2 werden alle gleichmäßig hochgezählt, da sind also zwei Variablen überflüssig.
Dann ist ein vergleich `länge - b > 0` viel schwieriger zu verstehen als `länge > b` oder noch besser `b < länge`. Denn dann sieht man viel besser, dass die while-Schleife eigentlich eine for-range-Schleife ist.
Da `x` immer den Wert 0 hat, kann man den auch gleich einsetzen. Zuerst wird `L[i1]` x zugewiesen, dann gleich danach einem anderen Wert, die erste Zuweisung kann also weg.

Bleibt also:

Code: Alles auswählen

def bubblesort(values, number_of_elements_sorted=0):
    länge = len(values) - number_of_elements_sorted
    for i in range(länge):
        if values[i] > values[i + 1]:
            values[i] = values[i + 1]
            values[i + 1] = 0
    bubbesort(values, number_of_elements_sorted + 1)

unsortiert = [21, 6, 24, 10, 11, 7, 19]
bubblesort(unsortiert)
Und hier ist auch gleich klar, dass wenn `i` bis len(values) - 1 läuft, i + 1 zu einem IndexError führt.
Dann fällt noch auf, dass es kein Rekursionsende gibt, sondern number_of_elements_sorted bis ins unendliche steigt.
Dass irgendwelche Listenelemente mit 0 überschrieben werden, scheint auch nicht richtig zu sein.

Re: Bubble sort

Verfasst: Donnerstag 16. Dezember 2021, 15:42
von Sophie2112
Sirius3 hat geschrieben: Donnerstag 16. Dezember 2021, 15:34 Danke für die Antwort unser Lehrer hatte uns range vorher noch nie erklärt. ich hab endlich verstanden wie der Algorithmus funktioniert danke :)