Quicksort and random testing
We implemented a other sorting algorithm (Quicksort), and a random tester to compare the results of Quicksort and Mergesort.
Mergesort
In mergesort.py
:
def merge(l1: list, l2: list) -> list: index1 = 0 index2 = 0 result = [] while index1 < len(l1) or index2 < len(l2): if index1 >= len(l1): result.append(l2[index2]) index2 += 1 elif index2 >= len(l2): result.append(l1[index1]) index1 += 1 elif l1[index1] < l2[index2]: result.append(l1[index1]) index1 += 1 else: result.append(l2[index2]) index2 += 1 return result def mergesort(l: list) -> list: if len(l) <= 1: return l[:] l1 = l[:len(l) // 2] l2 = l[len(l) // 2:] l1_sorted = mergesort(l1) l2_sorted = mergesort(l2) return merge(l1_sorted, l2_sorted)
Quicksort
In quicksort.py
:
def quicksort(l: list) -> list: if len(l) <= 1: return l[:] pivot = l[0] smaller = [x for x in l if x < pivot] equal = [x for x in l if x == pivot] larger = [x for x in l if x > pivot] smaller_sorted = quicksort(smaller) larger_sorted = quicksort(larger) return smaller_sorted + equal + larger_sorted
Random testing
In test_sorting.py
:
from random import randint from quicksort import quicksort from mergesort import mergesort MAX_LENGTH = 5000 MIN_VALUE = -100 MAX_VALUE = 100 NUM_LISTS = 100 def random_list() -> list: length = randint(0, 5000) return [randint(MIN_VALUE, MAX_VALUE) for i in range(length)] def test_quicksort_mergesort(): for i in range(NUM_LISTS): lst = random_list() assert quicksort(lst) == mergesort(lst)