From cc730cae987a22bcbc2c09bbbcef269f238a72a5 Mon Sep 17 00:00:00 2001 From: Mateusz Zawadzki Date: Thu, 14 May 2020 10:05:57 +0200 Subject: [PATCH 1/5] Added strand sort --- sorts/strand_sort.py | 60 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 sorts/strand_sort.py diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py new file mode 100644 index 000000000000..8addc96634e1 --- /dev/null +++ b/sorts/strand_sort.py @@ -0,0 +1,60 @@ +from functools import partial +import operator + + +def strand_sort(arr: list, solution: list, _operator: callable): + """ + Strand sort implementation + source: https://en.wikipedia.org/wiki/Strand_sort + + :param arr: Unordered input list + :param solution: Ordered output list + :param _operator: Operator lt/gt to specify ascent/descent version + + Examples: + >>> solution_1 = [] + >>> strand_sort([4, 2, 5, 3, 0, 1], solution_1, operator.gt) + >>> solution_1 + [0, 1, 2, 3, 4, 5] + + >>> solution_2 = [] + >>> strand_sort([4, 2, 5, 3, 0, 1], solution_2, operator.lt) + >>> solution_2 + [5, 4, 3, 2, 1, 0] + """ + if not arr: + return + + sublist = [arr.pop(0)] + for i, item in enumerate(arr): + if _operator(item, sublist[-1]): + sublist.append(item) + arr.pop(i) + + # merging sublist into solution list + if not solution: + solution.extend(sublist) + else: + while sublist: + item = sublist.pop(0) + for i, xx in enumerate(solution): + if not _operator(item, xx): + solution.insert(i, item) + break + else: + solution.append(item) + + strand_sort(arr, solution, _operator) + + +strand_asc = partial(strand_sort, _operator=operator.gt) +strand_desc = partial(strand_sort, _operator=operator.lt) + +if __name__ == "__main__": + solution = [] + strand_asc([4, 3, 5, 1, 2], solution) + assert solution == [1, 2, 3, 4, 5] + + solution = [] + strand_desc([4, 3, 5, 1, 2], solution) + assert solution == [5, 4, 3, 2, 1] From 3291f5faaa99af567debe5881c1e4610ffc0bde9 Mon Sep 17 00:00:00 2001 From: Mateusz Zawadzki Date: Thu, 14 May 2020 11:22:19 +0200 Subject: [PATCH 2/5] Review changes --- sorts/strand_sort.py | 36 ++++++++++++++---------------------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py index 8addc96634e1..b828da185460 100644 --- a/sorts/strand_sort.py +++ b/sorts/strand_sort.py @@ -1,29 +1,28 @@ -from functools import partial import operator -def strand_sort(arr: list, solution: list, _operator: callable): +def strand_sort(arr: list, reverse: bool=False, solution: list=None): """ Strand sort implementation source: https://en.wikipedia.org/wiki/Strand_sort :param arr: Unordered input list - :param solution: Ordered output list - :param _operator: Operator lt/gt to specify ascent/descent version + :param reverse: Descent ordering flag + :param solution: Ordered items container Examples: - >>> solution_1 = [] - >>> strand_sort([4, 2, 5, 3, 0, 1], solution_1, operator.gt) - >>> solution_1 + >>> strand_sort([4, 2, 5, 3, 0, 1]) [0, 1, 2, 3, 4, 5] - >>> solution_2 = [] - >>> strand_sort([4, 2, 5, 3, 0, 1], solution_2, operator.lt) - >>> solution_2 + >>> strand_sort([4, 2, 5, 3, 0, 1], reverse=True) [5, 4, 3, 2, 1, 0] """ + _operator = operator.lt if reverse else operator.gt + solution = solution or [] + if not arr: - return + print(solution) + return solution sublist = [arr.pop(0)] for i, item in enumerate(arr): @@ -44,17 +43,10 @@ def strand_sort(arr: list, solution: list, _operator: callable): else: solution.append(item) - strand_sort(arr, solution, _operator) - + strand_sort(arr, reverse, solution) + return solution -strand_asc = partial(strand_sort, _operator=operator.gt) -strand_desc = partial(strand_sort, _operator=operator.lt) if __name__ == "__main__": - solution = [] - strand_asc([4, 3, 5, 1, 2], solution) - assert solution == [1, 2, 3, 4, 5] - - solution = [] - strand_desc([4, 3, 5, 1, 2], solution) - assert solution == [5, 4, 3, 2, 1] + assert strand_sort([4, 3, 5, 1, 2]) == [1, 2, 3, 4, 5] + assert strand_sort([4, 3, 5, 1, 2], reverse=True) == [5, 4, 3, 2, 1] From 2d62badec4bac423dadfab4cb169e9c242fdb04e Mon Sep 17 00:00:00 2001 From: Mateusz Zawadzki Date: Thu, 14 May 2020 11:24:28 +0200 Subject: [PATCH 3/5] Remove boilerplate code --- sorts/strand_sort.py | 1 - 1 file changed, 1 deletion(-) diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py index b828da185460..427154e22691 100644 --- a/sorts/strand_sort.py +++ b/sorts/strand_sort.py @@ -21,7 +21,6 @@ def strand_sort(arr: list, reverse: bool=False, solution: list=None): solution = solution or [] if not arr: - print(solution) return solution sublist = [arr.pop(0)] From 677eb7ed567932a7ca66bd5970c8d47761d7662d Mon Sep 17 00:00:00 2001 From: Mateusz Zawadzki Date: Thu, 14 May 2020 11:49:51 +0200 Subject: [PATCH 4/5] Fixed flake error: E252 --- sorts/strand_sort.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py index 427154e22691..c58f2008a64d 100644 --- a/sorts/strand_sort.py +++ b/sorts/strand_sort.py @@ -1,7 +1,7 @@ import operator -def strand_sort(arr: list, reverse: bool=False, solution: list=None): +def strand_sort(arr: list, reverse: bool = False, solution: list = None): """ Strand sort implementation source: https://en.wikipedia.org/wiki/Strand_sort From 457c6dc414f9e22bbae4c350dc69d1c36f2ac2ee Mon Sep 17 00:00:00 2001 From: Mateusz Zawadzki Date: Thu, 14 May 2020 12:06:47 +0200 Subject: [PATCH 5/5] Added missing return type hint --- sorts/strand_sort.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sorts/strand_sort.py b/sorts/strand_sort.py index c58f2008a64d..a89135a0691f 100644 --- a/sorts/strand_sort.py +++ b/sorts/strand_sort.py @@ -1,7 +1,7 @@ import operator -def strand_sort(arr: list, reverse: bool = False, solution: list = None): +def strand_sort(arr: list, reverse: bool = False, solution: list = None) -> list: """ Strand sort implementation source: https://en.wikipedia.org/wiki/Strand_sort