33https://en.wikipedia.org/wiki/Bead_sort
44"""
55
6+ from itertools import pairwise
67
78def 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
4261if __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