Bubble sort

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Sophie2112
User
Beiträge: 4
Registriert: Donnerstag 16. Dezember 2021, 14:11

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 :)
Sirius3
User
Beiträge: 18279
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Sophie2112
User
Beiträge: 4
Registriert: Donnerstag 16. Dezember 2021, 14:11

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 :)
Antworten