diff --git a/sorts/merge_sort.py b/sorts/merge_sort.py index e8031a1cb97c..572f38a57029 100644 --- a/sorts/merge_sort.py +++ b/sorts/merge_sort.py @@ -1,44 +1,40 @@ """ This is a pure Python implementation of the merge sort algorithm - For doctests run following command: python -m doctest -v merge_sort.py or python3 -m doctest -v merge_sort.py - For manual testing run: python merge_sort.py """ -def merge_sort(collection): +def merge_sort(collection: list) -> list: """Pure implementation of the merge sort algorithm in Python - :param collection: some mutable ordered collection with heterogeneous comparable items inside :return: the same collection ordered by ascending - Examples: >>> merge_sort([0, 5, 3, 2, 2]) [0, 2, 2, 3, 5] - >>> merge_sort([]) [] - >>> merge_sort([-2, -5, -45]) [-45, -5, -2] """ - def merge(left, right): + def merge(left: list, right: list) -> list: """merge left and right :param left: left collection :param right: right collection :return: merge result """ - result = [] - while left and right: - result.append((left if left[0] <= right[0] else right).pop(0)) - return result + left + right + def _merge(): + while left and right: + yield (left if left[0] <= right[0] else right).pop(0) + yield from left + yield from right + return list(_merge()) if len(collection) <= 1: return collection @@ -47,6 +43,8 @@ def merge(left, right): if __name__ == "__main__": + import doctest + doctest.testmod() user_input = input("Enter numbers separated by a comma:\n").strip() unsorted = [int(item) for item in user_input.split(",")] print(*merge_sort(unsorted), sep=",")