diff --git a/README.md b/README.md index 88553ad..b2b138e 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,14 @@ - implements edge weights on edges in our graph ## Binary Search Tree -- http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html +- http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html + +## Insert Sort +- implements insert sort +- compares each value in list with previous value +- inserts number when it is no longer less than previous value +- best case is an already sorted list +- worst case is a reversed list ### Singly vs. Doubly Linked Lists - A Singly Linked-List diff --git a/src/bst.py b/src/bst.py index caaea01..651ab3b 100644 --- a/src/bst.py +++ b/src/bst.py @@ -264,3 +264,28 @@ def delete(self, val): else: self.root = replacement self.length -= 1 + + def self_balancing(self): + cur = self.root + if self.balance(cur) <= 1 or self.balance(cur) >= -1: + return + + def right_rotation(self, node): + parent = node.left + parent.right = node + return parent + + def left_rotation(self, node): + parent = node.right + parent.left = node + return parent + + def right_left_rotation(self, node): + node.right = self.right_rotation(node.right) + node = self.left_rotation(node) + return node + + def left_right_rotation(self, node): + node.left = self.left_rotation(node.left) + node = self.right_rotation(node) + return node diff --git a/src/insert_sort.py b/src/insert_sort.py new file mode 100644 index 0000000..706305f --- /dev/null +++ b/src/insert_sort.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +import timeit + + +BEST_CASE = [x for x in range(0, 1000)] +WORST_CASE = BEST_CASE[::-1] + + +def insert_sort(l): + """Sort a list by inserting values in order after comparing each value.""" + if len(l) <= 1: + return + for idx in range(1, len(l)): + cur = l[idx] + spot = idx + while spot > 0 and l[spot - 1] > cur: + l[spot] = l[spot - 1] + spot = spot - 1 + l[spot] = cur + + +if __name__ == '__main__': + print("Best Case: a list already in order") + print("number of runs: 1000 / average time: " + str((timeit.Timer( + "insert_sort(BEST_CASE)", setup="from __main__ import insert_sort, BEST_CASE").timeit( + number=1000))/1000)) + print("Worst Case: a list in reverse order") + print("number of runs: 1000 / average time: " + str( + (timeit.Timer( + "insert_sort(WORST_CASE)", setup="from __main__ import insert_sort, WORST_CASE").timeit( + number=1000))/1000)) diff --git a/src/test_insert_sort.py b/src/test_insert_sort.py new file mode 100644 index 0000000..25ecc94 --- /dev/null +++ b/src/test_insert_sort.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import copy +import random +import pytest + + +TEST_LIST = [ + [], [8] +] + +for x in range(0, 10): + y = (random.sample(range(100), random.randint(1, 50))) + TEST_LIST.append(y) + + +@pytest.mark.parametrize('test_list', TEST_LIST) +def test_insertion_sort_random(test_list): + from insert_sort import insert_sort + start_list = copy.copy(test_list) + insert_sort(test_list) + assert test_list == sorted(start_list) + + +def test_best_case(): + from insert_sort import BEST_CASE + assert isinstance(BEST_CASE, list) + + +def test_worst_case(): + from insert_sort import WORST_CASE + assert isinstance(WORST_CASE, list)