From 3c55383949162cbd4a57a81cf8b3be428dd4e289 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Fri, 23 Sep 2016 15:43:53 -0700 Subject: [PATCH 1/7] created helper functions for self balancing function --- src/bst.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) 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 From b26334784ece73299f97afcba96e9e8749dae004 Mon Sep 17 00:00:00 2001 From: Steven Than Date: Fri, 23 Sep 2016 19:21:45 -0700 Subject: [PATCH 2/7] done test --- src/insert_sort.py | 11 +++++++++++ src/test_insert_sort.py | 14 ++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/insert_sort.py create mode 100644 src/test_insert_sort.py diff --git a/src/insert_sort.py b/src/insert_sort.py new file mode 100644 index 0000000..fabb9d5 --- /dev/null +++ b/src/insert_sort.py @@ -0,0 +1,11 @@ +def insert_sort(l): + """docstring""" + nl = [] + for x in l: + for y in nl: + if x < y: + nl.insert(nl.index(y), x) + break + else: + nl.append(x) + return nl diff --git a/src/test_insert_sort.py b/src/test_insert_sort.py new file mode 100644 index 0000000..2ee4042 --- /dev/null +++ b/src/test_insert_sort.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import random +import pytest + +TEST_LIST = [ + (random.sample(range(100), random.randint(1, 50))) +] + + +@pytest.mark.parametrize('test_list', TEST_LIST) +def test_insertion_sort_random(test_list): + from insert_sort import insert_sort + assert insert_sort(test_list) == sorted(test_list) From 25c498465fc4285c917a9a8d5101b2352cc7534c Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Sun, 25 Sep 2016 03:45:13 -0700 Subject: [PATCH 3/7] refactored insert_sort, printing best and worst case scenarios --- src/insert_sort.py | 41 +++++++++++++++++++++++++++++++---------- src/test_insert_sort.py | 20 ++++++++++++++++++-- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/insert_sort.py b/src/insert_sort.py index fabb9d5..32ecd59 100644 --- a/src/insert_sort.py +++ b/src/insert_sort.py @@ -1,11 +1,32 @@ +# -*- coding: utf-8 -*- +import timeit + + +best_case = [x for x in range(0, 1000)] +worst_case = best_case[::-1] + + def insert_sort(l): - """docstring""" - nl = [] - for x in l: - for y in nl: - if x < y: - nl.insert(nl.index(y), x) - break - else: - nl.append(x) - return nl + """Sort a list by inserting values in order after comparing each value.""" + if len(l) <= 1: + return + else: + 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 index 2ee4042..b26c342 100644 --- a/src/test_insert_sort.py +++ b/src/test_insert_sort.py @@ -3,12 +3,28 @@ import random import pytest + TEST_LIST = [ - (random.sample(range(100), random.randint(1, 50))) + [], [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 - assert insert_sort(test_list) == sorted(test_list) + insert_sort(test_list) + assert test_list == sorted(test_list) + + +def test_best_case(): + from insert_sort import best_case + assert type(best_case) is list + + +def test_worst_case(): + from insert_sort import worst_case + assert type(worst_case) is list From e140a396aff7c1e8ae25beaf89ef15d0df97216b Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Sun, 25 Sep 2016 13:13:04 -0700 Subject: [PATCH 4/7] made test more meaningful --- src/test_insert_sort.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test_insert_sort.py b/src/test_insert_sort.py index b26c342..5eb31eb 100644 --- a/src/test_insert_sort.py +++ b/src/test_insert_sort.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals +import copy import random import pytest @@ -16,8 +17,9 @@ @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(test_list) + assert test_list == sorted(start_list) def test_best_case(): From 0a08cc2c44343eda09340d45a9ff7fbe4b30bcd0 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 27 Sep 2016 09:01:28 -0700 Subject: [PATCH 5/7] removed unecessary else, made global variables all caps --- src/insert_sort.py | 23 +++++++++++------------ src/test_insert_sort.py | 8 ++++---- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/insert_sort.py b/src/insert_sort.py index 32ecd59..706305f 100644 --- a/src/insert_sort.py +++ b/src/insert_sort.py @@ -2,31 +2,30 @@ import timeit -best_case = [x for x in range(0, 1000)] -worst_case = best_case[::-1] +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 - else: - 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 + 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( + "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( + "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 index 5eb31eb..4184a1c 100644 --- a/src/test_insert_sort.py +++ b/src/test_insert_sort.py @@ -23,10 +23,10 @@ def test_insertion_sort_random(test_list): def test_best_case(): - from insert_sort import best_case - assert type(best_case) is list + from insert_sort import BEST_CASE + assert type(BEST_CASE) is list def test_worst_case(): - from insert_sort import worst_case - assert type(worst_case) is list + from insert_sort import WORST_CASE + assert type(WORST_CASE) is list From 9f985671cfe281a8f359fc24f0a338ed1a3c4b81 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Tue, 27 Sep 2016 09:04:10 -0700 Subject: [PATCH 6/7] changed type to isinstance in test module --- src/test_insert_sort.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test_insert_sort.py b/src/test_insert_sort.py index 4184a1c..25ecc94 100644 --- a/src/test_insert_sort.py +++ b/src/test_insert_sort.py @@ -24,9 +24,9 @@ def test_insertion_sort_random(test_list): def test_best_case(): from insert_sort import BEST_CASE - assert type(BEST_CASE) is list + assert isinstance(BEST_CASE, list) def test_worst_case(): from insert_sort import WORST_CASE - assert type(WORST_CASE) is list + assert isinstance(WORST_CASE, list) From 3d3ac430661f77b1080f7507f48ef3fd5c10f357 Mon Sep 17 00:00:00 2001 From: Victor Benavente Date: Thu, 29 Sep 2016 08:23:50 -0700 Subject: [PATCH 7/7] updated readme --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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