Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
25 changes: 25 additions & 0 deletions src/bst.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
31 changes: 31 additions & 0 deletions src/insert_sort.py
Original file line number Diff line number Diff line change
@@ -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__':

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's weird is that this looks correct and your best case/ worse case look like they are what they should be, but I'm getting the same time performance for both cases. Are you getting the same?

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))
32 changes: 32 additions & 0 deletions src/test_insert_sort.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import copy
import random
import pytest


TEST_LIST = [
[], [8]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good edge cases. You should also make sure to include cases with duplicate values. Not as important for this assignment, more so for future sorts.

]

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)