diff --git a/q_sort.py b/q_sort.py new file mode 100644 index 0000000..339d8df --- /dev/null +++ b/q_sort.py @@ -0,0 +1,60 @@ +from merge_sort import timed_func + + +def q_sort(sequence): + if len(sequence) <= 1: + # Return a sequence of one sorted item, or stop if no input + return sequence + if len(sequence) == 2: + # Return a sequence of two sorted items + if sequence[1] > sequence[0]: + return sequence + else: + return sequence[::-1] + pivot = get_pivot(sequence) + left = [] + right = [] + center = [] + for index, item in enumerate(sequence): + if item < pivot: + left.append(item) + elif item > pivot: + right.append(item) + else: + center.append(item) + return q_sort(left) + center + q_sort(right) + + +def get_pivot(sequence): + first = sequence[0] + last = sequence[-1] + mid_index = len(sequence) // 2 + middle = sequence[mid_index] + + if last > first > middle or middle > first > last: + return first + if last > middle > first or first > middle > last: + return middle + return last + + + +@timed_func +def timed_q_sort(sequence): + return q_sort(sequence) + + +def same_maker(how_many): + moAr = [] + for each in range(how_many): + moAr.append(1) + return moAr + + +if __name__ == '__main__': + inputs = [range(500), range(1000)] + inputs.append(same_maker(500)) + inputs.append(same_maker(997)) + + for inp in inputs: + timed_q_sort(inp) diff --git a/test_q_sort.py b/test_q_sort.py new file mode 100644 index 0000000..3e86bd8 --- /dev/null +++ b/test_q_sort.py @@ -0,0 +1,59 @@ +from q_sort import get_pivot, q_sort + + +def test_get_pivot_f(): + a = [2, 1, 3] + assert get_pivot(a) == 2 + b = [2, 3, 1] + assert get_pivot(b) == 2 + + +def test_get_pivot_l(): + a = [1, 3, 2] + assert get_pivot(a) == 2 + b = [3, 1, 2] + assert get_pivot(b) == 2 + + +def test_get_pivot_m(): + a = [1, 5, 5, 2, 1, 1, 3] + assert get_pivot(a) == 2 + b = [3, 2, 1] + assert get_pivot(b) == 2 + + +def test_q_one(): + a = [4, 3, 2, 5, 7, 1, 6] + a = q_sort(a) + assert a == sorted(a) + + + +def test_q_two(): + a = [5, 5, 5, 5, 5, 5, 5, 5, 5] + a = q_sort(a) + assert a == sorted(a) + + +def test_q_mixed(): + a = [1, 2, 5, 4, 4, 6, 7, 9, 8, 10, 10] + a = q_sort(a) + assert a == sorted(a) + + +def test_q_mixed_duplicate_last_values_greater(): + a = [1, 2, 10, 10, 10] + a = q_sort(a) + assert a == sorted(a) + + +def test_q_mixed_duplicate_last_values_lesser(): + a = [1, 2, 5, 0, 0] + a = q_sort(a) + assert a == sorted(a) + + +def test_q_mixed(): + a = [1, 2, 5, 4, 4, 6, 7, 9, 8, 0, 0] + a = q_sort(a) + assert a == [0, 0, 1, 2, 4, 4, 5, 6, 7, 8, 9]