From a7f7b48a777a2e8d9fbefa83344cfd05c81c1806 Mon Sep 17 00:00:00 2001 From: Dan Buch Date: Mon, 15 Aug 2011 22:34:46 -0400 Subject: [PATCH] working through merge sort --- sorting.py | 38 ++++++++++++++++++++++++++++++++++++++ test_sorting.py | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/sorting.py b/sorting.py index 32cdaea..cbddb26 100644 --- a/sorting.py +++ b/sorting.py @@ -1,4 +1,6 @@ # vim:fileencoding=utf-8 +import math + def insertion_sort(a): """ Θ(n^2) """ @@ -9,3 +11,39 @@ def insertion_sort(a): a[i + 1] = a[i] i = i - 1 a[i + 1] = key + + +def merge_sort(m): + n = len(m) + if n <= 1: + return m + + middle = math.ceil(n / 2) + + left = m[:middle] + right = m[middle:] + + left = merge_sort(left) + right = merge_sort(right) + + return merge(left, right) + + +def merge(left, right): + result = [] + + while len(left) > 0 or len(right) > 0: + if len(left) > 0 and len(right) > 0: + if left[0] <= right[0]: + result.append(left.pop(0)) + else: + result.append(right.pop(0)) + + elif len(left) > 0: + result.append(left.pop(0)) + + elif len(right) > 0: + result.append(right.pop(0)) + + return result + diff --git a/test_sorting.py b/test_sorting.py index a34694b..55bcbf4 100644 --- a/test_sorting.py +++ b/test_sorting.py @@ -45,5 +45,46 @@ class TestInsertionSort(unittest.TestCase): self.assertEqual(expected, a) +class TestMergeSort(unittest.TestCase): + + def test_example(self): + tmpl = [8, 2, 4, 9, 3, 6] + a = tmpl[:] + expected = [2, 3, 4, 6, 8, 9] + + actual = sorting.merge_sort(a) + + self.assertEqual(expected, actual) + + def test_100_example(self): + tmpl = list(range(0, 1000)) + a = tmpl[:] + random.shuffle(a) + expected = tmpl[:] + + actual = sorting.merge_sort(a) + + self.assertEqual(expected, actual) + + def test_reversed_100_example(self): + tmpl = list(range(0, 1000)) + a = list(reversed(tmpl[:])) + expected = tmpl[:] + + actual = sorting.merge_sort(a) + + self.assertEqual(expected, actual) + + def test_1000_example(self): + tmpl = list(range(0, 1000)) + a = tmpl[:] + random.shuffle(a) + expected = tmpl[:] + + actual = sorting.merge_sort(a) + + self.assertEqual(expected, actual) + + if __name__ == '__main__': unittest.main()