def insert_sort(A):
"""バケット ソートのサブソートとしての挿入ソート"""
n = len(A)
if n return A
B = [] # A:
i = len(B)
の結果リスト
ただし、i > 0 および B[i-1] > a:
i = i - 1
B.insert(i, a);
return B
defbucket_sort(A):
"""バケットのソート、疑似コードは次のとおりです:
BUCKET-SORT(A)
1 n ← length[A] // バケットの数
2 for i ← 1 to n
3 do insert A[i] into list B[floor(nA[i])] // n 個の数値を各バケットに分配します
4 for i ← 0 to n- 1
5 do sort list B[i] with insert sort // 各バケット内の数値を並べ替えます
6 リスト B[0],B[1],...,B[n-1 ] を連結しますtogether in order // 各バケット内の要素を順番に連結します
バケット ソートは、入力が区間 [0,1) にわたって要素を均等に分散するランダム プロセスによって生成されることを前提としています。
"""
n = len(A)
buckets = [[] for _ in xrange(n)] # n 個の空のバケット
for a in A:
buckets[int ( n * a)].append(a)
B = []
for b in Buckets:
B.extend(insertion_sort(b))
return B
if __name__ == '__main__':
from ランダム import ランダム
from timeit import タイマー
項目 = [xrange(10000) の _ のランダム()]
def test_sorted():
print(items)
sorted_items =sorted(items)
print(sorted_items)
def test_bucket_sort():
print(items)
sorted_items = Bucket_sort(items)
print(sorted_items)
test_methods = [test_sorted, test_bucket_sort]
test_methods のテスト用:
name = test.__name__ # test.func_name
t = Timer(name + '()', 'from __main__ import ' + name)
print(name + ' 時間がかかります : %f' % t.timeit(1))