Merge-Sort-Algorithmus

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
MarWill11
User
Beiträge: 6
Registriert: Freitag 8. Mai 2015, 16:35

Hallo,

ich habe ein kleines Problem mit meinem Programm.
Ich soll einen Merge-Sort-Algorithmus programmieren, der die Anzahl der durchgeführten Vergleiche ausgibt und die sortierte Liste.
Ich kriege aber bei meiner Programmierung lediglich die Zufallsliste ausgespuckt...wenn ich "print Ergebnis" eingebe, dann gibt er mir gar nichts aus.
Was muss ich da verbessern, dass das gewünschte geliefert wird?
(Bitte einfache Erklärungen bzw Hinweise, da ich mit Python und allgemein mit Programmieren nicht wirklich vertraut bin.)

...außerdem lautet die Aufgabe weiter:
"Führen Sie damit eine (größere) Anzahl Sortierungen von verschiedenen Feldern gleicher Größe durch! Bestimmen Sie die Anzahl der durchschnittlich notwendigen Tausch-Aktionen, die geringste Anzahl sowie die größte Anzahl notwendiger Tausch-Aktionen!"
...wie würde man dies realisieren können?


Danke schon mal im Voraus für jede Hilfe.!!! :)


Mein bisheriges Programm:
___

Code: Alles auswählen

import random

a=input("Range untere Grenze: ")
b=input("Range obere Grenze (ausschließlich: ")
c=input("Anzahl der Zufallszahlen: ")

z=random.sample(range(a,b),c)
zaehler = 0

def mergesort(z):
    if len(z)==1:
        return z
    else:
        m=len(z)/2
        l=mergesort(z[:m])
        r=mergesort(z[m:])
        return mergesort(l,r)
    
def merge(l,r):
    global zaehler
    Ergebnis=[]
    while len(l)>0 and len(r)>0:
        if l[0] < r[0]:
            Ergebnis.append(l.pop(0))
        else:
            Ergebnis.append(r.pop(0))
    zaehler=zaehler+1
    Ergebnis.extend(l)
    Ergebnis.extend(r)
    return Ergebnis

print z
print zaehler
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo rufst Du Deine Sortierfunktion auf?
MarWill11
User
Beiträge: 6
Registriert: Freitag 8. Mai 2015, 16:35

meinst du mit "aufrufen", dass ich vor dem print nochmal "mergesort(z)" eingebe?
oder vielleicht "merge(r,l)"?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MarWill11: genau. Damit Funktionen ausgeführt werden, muß man sie aufrufen.
Lateralus
User
Beiträge: 5
Registriert: Dienstag 19. April 2011, 19:45

Hi, ich hab jetzt die Programm-Logik nicht genau geprüft, aber so scheint es zu funktionieren:

Ich habe deine globalen Aufrufe mal in die Funktion main verschoben, welche durch die letzten zwei Zeilen aufgerufen wird, wenn die Datei ausgeführt wird. (So kann man die Datei auch als Modul verwenden.) Wenn du das nicht verstehst, kannst du es für's erste ignorieren. Die erste Zeile ist dazu da, dem Interpreter mitzuteilen, dass der Code UTF-8 zeichen verwendet (

Ich habe zwei Zeilen geändert die fehlerhaft waren: Zeile 11 und Zeile 17 (in deinem Skript). Die erste Zeile war bei mir nötig, als ich den Code aus dem Forum kopiert habe (scheint irgendein unsichtbares Zeichen, dass kein ASCII ist, mit dabei zu sein...)

Der Aufruf der Funktion erfolgt bei mir in Zeile 15.

Code: Alles auswählen

# -*- coding: utf-8 -*-

import random

def main():
    a = input("Range untere Grenze: ")
    b = input("Range obere Grenze (ausschließlich): ")
    c = input("Anzahl der Zufallszahlen: ")
 
    z = random.sample(range(a,b),c)
    global zaehler
    zaehler = 0
    
    print(z)
    ergebnis = mergesort(z)
    print(ergebnis)
    print(zaehler)

 
def mergesort(z):
    # if len(z) == 1:
    if len(z) <= 1:
        return z
    else:
        m = len(z)/2
        l = mergesort(z[:m])
        r = mergesort(z[m:])
        # return mergesort(l,r)
        return merge(l, r)
   
def merge(l,r):
    global zaehler
    Ergebnis = []
    while len(l)>0 and len(r)>0:
        if l[0] < r[0]:
            Ergebnis.append(l.pop(0))
        else:
            Ergebnis.append(r.pop(0))
    zaehler = zaehler + 1
    Ergebnis.extend(l)
    Ergebnis.extend(r)
    return Ergebnis

if __name__ == '__main__':
  main()
MarWill11
User
Beiträge: 6
Registriert: Freitag 8. Mai 2015, 16:35

Wow. 1000 Dank.!!
Ich habe aber noch eine Frage zu den letzten beiden Zeilen: Welche Bedeutung haben die? Ohne diese Zeilen funktioniert es ja nicht, aber ich habe dieses

Code: Alles auswählen

if __name__ == '__main__':
  main()
noch nie gesehen. :/

Hättest du vielleicht auch einen Hinweis zur Teilaufgabe:
"Führen Sie damit eine (größere) Anzahl Sortierungen von verschiedenen Feldern gleicher Größe durch! Bestimmen Sie die Anzahl der durchschnittlich notwendigen Tausch-Aktionen, die geringste Anzahl sowie die größte Anzahl notwendiger Tausch-Aktionen!"
...also keine Lösung, sondern nur eine Idee wie man es realisieren könnte? :)


Beste Grüße :)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

__name__ ist der Name des Moduls unter dem es importiert wurde und wird vom Interpreter gesetzt. Wenn du ein Modul direkt ausführst hast du es nicht importiert, in diesem Fall wird der spezielle Name __main__ verwendet. Die main() funktioniert wird in diesem Fall also nur dann ausgeführt wenn dieses Modul direkt ausgeführt und nicht irgendwo importiert wurde.

Dies erlaubt es das Modul z.B. in der Python Shell oder in Tests zu importieren so dass man mit einzelne Teile testen kann ohne dass das Program ausgeführt wird.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

MarWill11 hat geschrieben:Hättest du vielleicht auch einen Hinweis zur Teilaufgabe:
"Führen Sie damit eine (größere) Anzahl Sortierungen von verschiedenen Feldern gleicher Größe durch! Bestimmen Sie die Anzahl der durchschnittlich notwendigen Tausch-Aktionen, die geringste Anzahl sowie die größte Anzahl notwendiger Tausch-Aktionen!"
...also keine Lösung, sondern nur eine Idee wie man es realisieren könnte? :)
Hinweis: `zaehler`.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@MarWill11: Du hast noch nie eine if-Abfrage oder einen Funktionsaufruf gesehen? Nochmal, damit Funktionen ausgeführt werden, muß man sie aufrufen. In Python hat jedes Modul einen Namen, der in der Variable __name__ steht. Das Hauptprogramm hat dabei den festen Namen '__main__'. Damit wird erreicht, dass Python-Dateien sowohl als Modul als auch als Skript verwendet werden können.

Vergiss gleich wieder, dass es soetwas wie "global" gibt. Wenn "merge" etwas zählt, dann ist das ein zusätzlicher Rückgabeparameter. "mergesort" kann dann die einzelnen Zähler zusammenfassen und auch zurückgeben.
Übrigens, Du zählst falsch.

Dass "merge" die Listen "l" und "r" verändert ist ein unerwartetes Verhalten, das zumindest dokumentiert werden muß, auch wenn es sich nur um eine interne Funktion handelt.
Antworten