Finishes implementing merge sort. Some more tests to be made before switching to something else

This commit is contained in:
julien lengrand-lambert
2013-12-07 09:57:27 +01:00
parent ec1dafcaec
commit 1e88912eb8
2 changed files with 60 additions and 5 deletions

View File

@@ -7,7 +7,7 @@ Implementation of the MergeSort algorithm
class TableSorter():
"""
A utili=ty that provides way to sort arrays of elements.
A utility that provides a way to sort arrays of elements.
It should be possible to compare elements to each others
(meaning a > b and a == b should make sense).
"""
@@ -23,9 +23,38 @@ class TableSorter():
"""
if len(table) < 1:
return None
elif len(table) == 1:
return table
if idx_max == None:
idx_max = len(table)
#TODO: Implement
return None
t_1 = self.mergeSort(table[:len(table)/2])
t_2 = self.mergeSort(table[len(table)/2:])
return self._merge(t_1, t_2)
def _merge(self, t_1, t_2):
"""
Returns a sorted array t being the concatenation of values from t_1 and t_2.
t_1 and t_2 are expected to be sorted themselves.
"""
t = []
while(t_1 != [] or t_2 != []):
if(t_1 == []):
t.append(t_2.pop(0))
elif(t_2 == []):
t.append(t_1.pop(0))
else:
if(t_1[0] < t_2[0]):
t.append(t_1.pop(0))
else:
t.append(t_2.pop(0))
return t
if __name__ == "__main__":
table = [1, 2, 3, 4]
sorter = TableSorter()
sorter.mergeSort(table)

View File

@@ -10,13 +10,39 @@ import unittest
class test_table_sorter(unittest.TestCase):
#TODO: Implement
def test_merge(self):
table = [1, 2]
t_1 = [1]
t_2 = [2]
sorter = TableSorter()
self.assertEqual(table, sorter._merge(t_1, t_2))
t_1 = [2]
t_2 = [1]
self.assertEqual(table, sorter._merge(t_1, t_2))
table = [1, 2, 3, 5]
t_1 = [2, 5]
t_2 = [1, 3]
self.assertEqual(table, sorter._merge(t_1, t_2))
t_1 = [3, 5]
t_2 = [1, 2]
self.assertEqual(table, sorter._merge(t_1, t_2))
def test_mergeSort(self):
table = [1]
table = []
sorter = TableSorter()
self.assertEqual(None, sorter.mergeSort(table))
table = [1]
self.assertEqual(table, sorter.mergeSort(table))
table = [1, 2]
self.assertEqual(table, sorter.mergeSort(table))
if __name__ == "__main__":
unittest.main()