Hi,
hab eben Aufgabenzettel 4 gemacht und eine neue Variante von mergesort entworfen. Was haltet ihr davon, müsste doch eigentlich
auch richtig sein oder?
mergesort([],[]).
mergesort([K1|R1],EL):- mergesort(R1,LL),
merge([K1],LL,EL).
hm…bin mir nicht ganz sicher.
mergesort([],[]).%–>richtig!
mergesort([K1|R1],EL):- mergesort(R1,LL),
merge([K1],LL,EL).
Was tut merge? Lineares Einfügen von K1 in einer sortierten Liste LL, mit dem Ergebnis EL? (Ich hab den Zettel gerade nicht
vor mir) Warum muss K1 in Klammern stehen? Bitte einen Kommentar zu den Bezeichnern LL und EL oder etwas deutlichere Namen…
Ansonsten macht das einen ganz vernünftigen Eindruck
K1 muss in Klammern stehen, damit es eine Liste ist.
Ich baue als erstes die vorgegeben Liste mit hilfe von mergesort in eine LL=LereListe. Dann Sortiere ich jeden einzelnen
Kopf K1 als Liste getarnt mit merge in die LL Liste und erhalte eine lexikalisch sortierte Liste. Das Programm läuft wunderbar
und ich finds einfacher als die Variante auf der Musterlösung….
Ciao
Ich weiß nicht. Ist irgendwie mehr eine Variante zu 2© als zu 3©. Ich denke das es bei der Aufgabe gerade der Trick war,
es mit dem Selbstgebauten merge und split zu machen. Schneller und besser ist Deine Lösung sicherlich, aber ob soetwas in
der Klausur gut ankommen würde?
hab mir dann jetzt auch mal die musterlösung angeschaut und frage mich was die markierte stelle im Prädikat soll, ich meine mymerge übernimmt doch schon das vergleichen, oder was verstehe ich da nicht
mergesort([],[]).
mergesort([X],[X]).
mergesort(L1,L2):-split(L1,Teil1,Teil2),L1\=Teil1,mergesort(Teil1,Sort1),mergesort(Teil2,Sort2),mymerge(Sort1,Sort2,L2).
ups ich wollte eigentlich nur
L1\=Teil1 markieren
sorry
also das sortierverfahren, das da ganz oben steht, arbeitet genau wie das mysort aus 2.c, nur das statt 'insort' 'merge' verwendet wird, das bei einer 1er-liste so ziemlich das gleiche tut,
es wäre übersichtlicher, wenn man gleich alles direkt alles von 2.c. abgeschrieben hätte [img]
http://images.rapidforum.com/images/i25.gif[/img],
damit ist das verfahren von typ insort und nicht mergesort, was ja 2 grundverschiede sortierverfahren sind mit unterschiedlichen rechenaufwand wie in 3.d. angedeutet,
als lösung für mergesort würde ich das als korrektor also in die ecke 0 punkte einorden [img]
http://images.rapidforum.com/images/i25.gif[/img]
L1\=Teil1 steht da, damit ein aufruf mergesort([a],X), der in der zweiten zeile schon abschliessend bearbeitet wird, nicht zusätzlich noch in der 3. zeile zerlegt wird und damit ein zweites identisches ergebnis liefert, denk ich mal
Ja,
geht aber auch so
mergesort([],[]).
mergesort([X],[X]).
mergesort([X1,X2|Rl],L2):-split([X1,X2|Rl],Teil1,Teil2),merg
esort(Teil1,Sort1),mergesort(Teil2,Sort2),mymerge(Sort1,Sort
2,L2).
Sorgt dafür, daß die dritte Alternative nur bei Listen mit mehr als einem Element unifiziert werden kann.