mirror of
https://github.com/TheAlgorithms/Python.git
synced 2025-01-18 08:17:01 +00:00
Added strand sort (#1982)
* Added strand sort * Review changes * Remove boilerplate code * Fixed flake error: E252 * Added missing return type hint
This commit is contained in:
parent
565060aa99
commit
bc8e8f03fd
51
sorts/strand_sort.py
Normal file
51
sorts/strand_sort.py
Normal file
|
@ -0,0 +1,51 @@
|
|||
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]
|
Loading…
Reference in New Issue
Block a user