in der Uni haben wir die Aufgabe bekommen ein Programm in python 3 zu schreiben, welches die relativ bekannte Funktion MergeSort (Sortieren einer Liste durch Rekursion und zerteilen der liste in immer kleinere Stücke) implementiert.
Ein solches Programm habe ich geschrieben und es funktioniert auch einwandfrei:
Code: Alles auswählen
import math
#Appender fuegt alle Eintraege aus Liste L ab dem Eintrag k der Reihe nach in Liste C ein
def Appender(C,L,k):
for z in range(k,len(L)):
C.append(L[z])
#Merge fuegt die vorsortierten Listen A und B so zusammen, dass die Eintraege in C der Groeße nach geordnet sind
def Merge(A,B):
L = []
i=0
j=0
for k in range((len(A)+len(B))):
if A[i] < B[j]:
L.append(A[i])
if i < (len(A)-1):
i=i+1
else:
#fuegt den Rest von Liste B an, wenn Liste A bereits komplett in L ist
Appender(L,B,j)
break
else:
L.append(B[j])
if j < (len(B)-1):
j=j+1
else:
#fuegt den Rest von Liste A an, wenn Liste B bereits komplett in L ist
Appender(L,A,i)
break
return L
def mergeSort(L):
'''implements merge sort for a list L'''
print("Splitting",L)
r = len(L)
B = []
C = []
if len(L) <= 1:
return L
if r>1:
m = math.ceil(r/2)
B = L[:m]
C = L[m:]
B = mergeSort(B)
C = mergeSort(C)
L = Merge(B,C)
return L
Code: Alles auswählen
import unittest
import random
from io import StringIO
from unittest.mock import patch
from mergeSort import mergeSort
from mergeSort import Merge
from mergeSort import Appender
class TestMergeSort(unittest.TestCase):
def testSplitting(self):
with patch('sys.stdout', new=StringIO()) as fakeOutput:
expected = 'Splitting [5, 3, 2, 1]\nSplitting [5, 3]\nSplitting [5]\n'
expected += 'Splitting [3]\nSplitting [2, 1]\nSplitting [2]\nSplitting [1]\n'
mergeSort([5,3,2,1])
self.assertEqual(fakeOutput.getvalue(), expected)
def testInverted(self):
actual = list(reversed(range(9)))
expected = sorted(actual[:])
print("Sorting {0}".format(actual))
mergeSort(actual)
self.assertEqual(expected, actual)
if __name__ == '__main__':
unittest.main(verbosity=2)
Wenn ich dieses ausführe sagt es mir allerdings, dass der Test failed ist.
Ich bin mir ziemlich sicher, dass dies an der Variablenbezeichnung /Funktionsbezeichnung innerhalb meines Programmes liegt.
Dass mein Code weder Laufzeitschonend noch "schön" geschrieben ist, ist mir an der Stelle erstmal zweitrangig.
Mit freundlich Grüßen
Cr0issant