2020-05-22 07:41:40 +00:00
|
|
|
"""
|
2021-10-04 04:07:58 +00:00
|
|
|
Bead sort only works for sequences of non-negative integers.
|
2020-05-22 07:41:40 +00:00
|
|
|
https://en.wikipedia.org/wiki/Bead_sort
|
|
|
|
"""
|
|
|
|
|
2024-04-02 17:07:33 +00:00
|
|
|
from itertools import pairwise
|
|
|
|
|
2020-05-22 07:41:40 +00:00
|
|
|
|
|
|
|
def bead_sort(sequence: list) -> list:
|
|
|
|
"""
|
|
|
|
>>> bead_sort([6, 11, 12, 4, 1, 5])
|
|
|
|
[1, 4, 5, 6, 11, 12]
|
|
|
|
|
|
|
|
>>> bead_sort([9, 8, 7, 6, 5, 4 ,3, 2, 1])
|
|
|
|
[1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
|
|
|
|
|
|
>>> bead_sort([5, 0, 4, 3])
|
|
|
|
[0, 3, 4, 5]
|
|
|
|
|
|
|
|
>>> bead_sort([8, 2, 1])
|
|
|
|
[1, 2, 8]
|
|
|
|
|
|
|
|
>>> bead_sort([1, .9, 0.0, 0, -1, -.9])
|
|
|
|
Traceback (most recent call last):
|
2022-10-27 17:42:30 +00:00
|
|
|
...
|
2021-10-20 08:42:32 +00:00
|
|
|
TypeError: Sequence must be list of non-negative integers
|
2020-05-22 07:41:40 +00:00
|
|
|
|
|
|
|
>>> bead_sort("Hello world")
|
|
|
|
Traceback (most recent call last):
|
2022-10-27 17:42:30 +00:00
|
|
|
...
|
2021-10-20 08:42:32 +00:00
|
|
|
TypeError: Sequence must be list of non-negative integers
|
2020-05-22 07:41:40 +00:00
|
|
|
"""
|
|
|
|
if any(not isinstance(x, int) or x < 0 for x in sequence):
|
2021-10-20 08:42:32 +00:00
|
|
|
raise TypeError("Sequence must be list of non-negative integers")
|
2020-05-22 07:41:40 +00:00
|
|
|
for _ in range(len(sequence)):
|
2024-04-02 17:07:33 +00:00
|
|
|
for i, (rod_upper, rod_lower) in enumerate(pairwise(sequence)):
|
2020-05-22 07:41:40 +00:00
|
|
|
if rod_upper > rod_lower:
|
|
|
|
sequence[i] -= rod_upper - rod_lower
|
|
|
|
sequence[i + 1] += rod_upper - rod_lower
|
|
|
|
return sequence
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
assert bead_sort([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5]
|
|
|
|
assert bead_sort([7, 9, 4, 3, 5]) == [3, 4, 5, 7, 9]
|