mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-27 23:11:09 +00:00
bc8e8f03fd
* Added strand sort * Review changes * Remove boilerplate code * Fixed flake error: E252 * Added missing return type hint
52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
import operator
|
|
|
|
|
|
def strand_sort(arr: list, reverse: bool = False, solution: list = None) -> list:
|
|
"""
|
|
Strand sort implementation
|
|
source: https://en.wikipedia.org/wiki/Strand_sort
|
|
|
|
:param arr: Unordered input list
|
|
:param reverse: Descent ordering flag
|
|
:param solution: Ordered items container
|
|
|
|
Examples:
|
|
>>> strand_sort([4, 2, 5, 3, 0, 1])
|
|
[0, 1, 2, 3, 4, 5]
|
|
|
|
>>> 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 solution
|
|
|
|
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, reverse, solution)
|
|
return solution
|
|
|
|
|
|
if __name__ == "__main__":
|
|
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]
|