From cf385ad7effb5d546ce44bf8e884a201fdb555ab Mon Sep 17 00:00:00 2001 From: wuyudi Date: Thu, 27 Aug 2020 15:45:03 +0800 Subject: [PATCH] Update merge_sort.py (#2356) * Update merge_sort.py * Update merge_sort.py --- sorts/merge_sort.py | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/sorts/merge_sort.py b/sorts/merge_sort.py index e8031a1cb..572f38a57 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_sort(collection): 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=",")