Seite 1 von 1

Anfänger in Python -> Bubblesort

Verfasst: Samstag 24. April 2010, 16:45
von Kanashimi
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?

Re: Anfänger in Python -> Bubblesort

Verfasst: Samstag 24. April 2010, 17:07
von ms4py
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.

Verfasst: Samstag 24. April 2010, 17:34
von Kanashimi
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?

Verfasst: Samstag 24. April 2010, 17:47
von lunar
@Kanashimi: Gegenfrage: Warum sollte sie denn "0" zurückgegeben?

Verfasst: Sonntag 25. April 2010, 08:44
von Kanashimi
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. ;)

Verfasst: Sonntag 25. April 2010, 08:56
von ms4py
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.