Skip to content

Commit 897ed83

Browse files
committed
solve bead sort
1 parent 13f427a commit 897ed83

File tree

1 file changed

+25
-6
lines changed

1 file changed

+25
-6
lines changed

sorts/bead_sort.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
https://en.wikipedia.org/wiki/Bead_sort
44
"""
55

6+
from itertools import pairwise
67

78
def bead_sort(sequence: list) -> list:
89
"""
10+
Sorts a list of non-negative integers using bead sort.
11+
912
>>> bead_sort([6, 11, 12, 4, 1, 5])
1013
[1, 4, 5, 6, 11, 12]
1114
@@ -32,13 +35,29 @@ def bead_sort(sequence: list) -> list:
3235

3336
if any(not isinstance(x, int) or x < 0 for x in sequence):
3437
raise TypeError("Sequence must be list of non-negative integers")
35-
for i, (rod_upper, rod_lower) in enumerate(zip(sequence, sequence[1:])):
36-
if rod_upper > rod_lower:
37-
sequence[i] -= rod_upper - rod_lower
38-
sequence[i + 1] += rod_upper - rod_lower
39-
return sequence
38+
39+
# Early return for empty list
40+
if not sequence:
41+
return []
42+
43+
max_value = max(sequence)
44+
beads = [[0] * len(sequence) for _ in range(max_value)]
45+
46+
# Drop beads
47+
for i, num in enumerate(sequence):
48+
for j in range(num):
49+
beads[j][i] = 1
50+
51+
# Let beads "fall"
52+
for row in beads:
53+
count = sum(row)
54+
for i in range(len(row)):
55+
row[i] = 1 if i < count else 0
56+
57+
# Read off sorted sequence
58+
return [sum(beads[j][i] for j in range(max_value)) for i in range(len(sequence))]
4059

4160

4261
if __name__ == "__main__":
4362
assert bead_sort([5, 4, 3, 2, 1]) == [1, 2, 3, 4, 5]
44-
assert bead_sort([7, 9, 4, 3, 5]) == [3, 4, 5, 7, 9]
63+
assert bead_sort([7, 9, 4, 3, 5]) == [3, 4, 5, 7, 9]

0 commit comments

Comments
 (0)