ビーズソートまたは重力ソートとはJoshua J. Arulanandham、Cristian S. Calude、Michael J. Dinneenの3人によって2002年に発見されたソートアルゴリズムである。ヨーロッパ理論計算機科学会で発表された。ソフトウェアでの実装でも、ハードウェアでの実装でも時間計算量はO(n)であるが、特にソフトウェアでの実装では時間がかかることがあり、負の数のソートには使えないという欠点も持つ。また、少なくともこのアルゴリズムは空間計算量がO(n2)である。
defGravity(obj):ifall([type(x)==intandx>=0forxinobj]):reference=[range(x)forxinobj]else:raiseValueError("入力は正の整数である必要があります")intermediate=[]index=0previous=sum([1forxinreferenceiflen(x)>index])whileprevious:intermediate.append(range(previous))index+=1previous=sum([1forxinreferenceiflen(x)>index])index=0previous=sum([1forxinintermediateiflen(x)>index])out=[]whileprevious:out.append(previous)index+=1previous=sum([1forxinintermediateiflen(x)>index])out=out[::-1]returnout"""how it does it: it counts the "beads" in each column, then uses those numbers to make a new set of rows.Adding up the beads in each column after turning the initial sums into the new rows gives the backwardsversion of the sorted list, which is then turned around using list slicing.If you believe you understand how the code does it and think you can describe it better, feel free to editthis description.Note: 0を含むと、 prev が0となり、while文が止まってしまう可能性がある"""# contributed by an amateur programmer. Feel free to test & use it.