Anfänger in Python -> Bubblesort

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
Kanashimi
User
Beiträge: 3
Registriert: Samstag 24. April 2010, 16:38

Hallo,

ich habe sehr lange in PHP programmiert und wollte mich jetzt mal einer vernünftigen Sprache widmen, die es nicht erfordert codetechnische Verrenkungen zu basteln, um Banalitäten zu ermöglichen. ;)

Hallo Python sag ich da nur! :D

Ich hab mir das jetzt 5 Minuten angeguckt und wollte als erstes Testbeispiel mal den Bubblesort-Algorithmus programmieren. Als Vorlage habe ich den Pseudo-Code von Wikipedia http://de.wikipedia.org/wiki/Bubblesort genommen.

Code: Alles auswählen

a = [10,14,7,200,50,3]

def bubblesort(array):
    n = len(array)
    while 1:
        changed = 0
        for i in range(n):
            if array[i] > array[i+1]:
                array[i] = array[i+1]
                array[i+1] = array[i]
                changed = 1
        n -= 1
        if(changed == 1 and n > 1):
            pass
        else:
            return 0
            
bubblesort(a)
Das ist mein Code, wie es denke ich in Python aussieht. Allerdings kommt die Fehlermeldung "IndexError: list index out of range". Wenn man sich mal die beiden Zeilen anguckt, wo im Array beide Werte vertauscht werden, wird es wohl daran liegen. Schließlich existiert der alte Wert von array ja längst nicht mehr, als er array[i+1] zugefügt werden soll. Ich finde nur leider keine Funktionen in Python, die mir ein derartiges Vertauschen ermöglichen.

Kann da jemand einem Anfänger helfen?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Kanashimi hat geschrieben:Hallo Python sag ich da nur! :D
Sehr schön :)
Kanashimi hat geschrieben: Das ist mein Code, wie es denke ich in Python aussieht. Allerdings kommt die Fehlermeldung "IndexError: list index out of range". Wenn man sich mal die beiden Zeilen anguckt, wo im Array beide Werte vertauscht werden, wird es wohl daran liegen. Schließlich existiert der alte Wert von array ja längst nicht mehr, als er array[i+1] zugefügt werden soll. Ich finde nur leider keine Funktionen in Python, die mir ein derartiges Vertauschen ermöglichen.

Kann da jemand einem Anfänger helfen?


Vertauschen könntest du so. Allerdings ist das nicht der Grund für den IndexError. Du darfst nur bis n-1 iterieren.

Code: Alles auswählen

>>> a = [1, 2]
>>> a[0], a[1] = a[1], a[0]
>>> a
[2, 1]
Zeile 13 - 16 ist ziemlicher Unsinn. Für `changed`solltest du einen Bool nehmen und dann das Ganze ohne else Konstrukt: ``if not (expr): return ``
"0" Zurückgeben ist außerdem auch nicht sehr sinnvoll.

BTW: Sortieralgorithmen oder andere Algorithmen, in denen man normalerweise mit `while`iterieren muss/sollte, sind IMO nicht sehr geeignet um Python zu lernen.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Kanashimi
User
Beiträge: 3
Registriert: Samstag 24. April 2010, 16:38

Vielen Dank, ich habe daraus jetzt:

Code: Alles auswählen

a = [10,14,7,200,50,3]

def bubblesort(array):
    n = len(array)
    while 1:
        changed = False
        for i in range(n-1):
            if array[i] > array[i+1]:
                array[i],array[i+1] = array[i+1],array[i]
                changed = True
        n -= 1
        if not (changed):
            print(array)
            return
            
bubblesort(a)
gemacht. Das mit dem n-1 war ein Fehler von mir, das mit Vertauschen klar. Nur wieso soll ich bitte nur return schreiben?
lunar

@Kanashimi: Gegenfrage: Warum sollte sie denn "0" zurückgegeben?
Kanashimi
User
Beiträge: 3
Registriert: Samstag 24. April 2010, 16:38

lunar hat geschrieben:@Kanashimi: Gegenfrage: Warum sollte sie denn "0" zurückgegeben?
Ich bin es einfach von PHP gewöhnt zumindest irgendwas und sei es nur return 0 zurückzugeben. ;)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Kanashimi hat geschrieben:
lunar hat geschrieben:@Kanashimi: Gegenfrage: Warum sollte sie denn "0" zurückgegeben?
Ich bin es einfach von PHP gewöhnt zumindest irgendwas und sei es nur return 0 zurückzugeben. ;)
Dann musst du dich eben umgewöhnen :P

Durch das `return` wird außerdem `None` zurückgegeben und nicht "nichts". Ein `None`kommt auch zurück, wenn in einer Funktion überhaupt kein `return`Statement steht. Damit ist das Zurückgeben von `None`auch das erwartete Verhalten einer Funktion, die keinen expliziten Rückgabewert/-typ angibt.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
Antworten