diff --git a/intro-to-algorithms/ch01.py b/intro-to-algorithms/ch01.py new file mode 100644 index 0000000..aced933 --- /dev/null +++ b/intro-to-algorithms/ch01.py @@ -0,0 +1,57 @@ +from __future__ import print_function + +import os +import random +import unittest + + +DEBUG = os.environ.get('DEBUG') == '1' + + +def debug(msg): + if DEBUG: + print(msg) + + +def insertion_sort(arr): + debug('BEGIN') + for j in range(1, len(arr)): + key = arr[j] + i = j - 1 + debug('FOR:\tj={}, key={}, i={}'.format(j, key, i)) + + while i > -1 and arr[i] > key: + arr[i + 1] = arr[i] + debug('WHILE:\tset: arr[{}] = {}'.format(i + 1, arr[i])) + i = i - 1 + + arr[i + 1] = key + debug('FOR:\tset: arr[{}] = {}'.format(i + 1, key)) + + debug('END') + return arr + + +class TestStuff(unittest.TestCase): + + def test_insertion_sort_small(self): + self.assertEqual( + [1, 2, 3, 4, 5, 6], + insertion_sort([5, 2, 4, 6, 1, 3]) + ) + + def test_insertion_sort_large(self): + inlist = range(1000) + listcopy = inlist[:] + random.shuffle(inlist) + random.shuffle(inlist) + self.assertEqual(listcopy, insertion_sort(inlist)) + + def test_insertion_sort_large_reversed(self): + inlist = range(1000) + listcopy = inlist[:] + self.assertEqual(listcopy, insertion_sort(list(reversed(inlist)))) + + +if __name__ == '__main__': + unittest.main()