使用Python实现桶排序
基于对插入排序实现桶排序
假定
输入数据均匀,独立地分布在[0,1)区间
运行时间为
算法的期望运行时间:O(n)
伪算法
'''
BUCKET-SORT(A)
n=A.length
letB[0..n-1] be a new arrap
for i =1 to n-1
make b[i] an empth list
for i = 1 to n
insert A[i] into list B[nA[i]]
for i = 0 to n-1
sort list B[i] with insertion sort
concatenate the lists B[0],B[1],...,B[n-1] together in order
'''
Python实现
def bucketSort(A):
n=len(A)
#创建数组B不能使用以下形式,否则会将同一个内存地址赋值给数组的每一个元素
#导致元素的任一个变动,整个数据都会随之变化
#B=[[]]*n
B=[]
for i in range(n):
B.append([])
for i in range(n):
B[int(A[i]*n)].append(A[i])
for i in range(n):
#调用插入排序(原址排序)
insertionSortAsc(B[i])
C=B[0]
#合并数组B获取排序好的数组A
for i in range(1,n):
C.extend(B[i])
return C
def insertionSortAsc(A):
'''原则排序数组A'''
for j in range(1,len(A)):
key=A[j]
i=j-1
while i>=0 and A[i]>key:
A[i+1]=A[i]
i-=1
A[i+1]=key
运行结果
import numpy
s=list(numpy.random.random(12))
print('排序前:',s)
print('排序后:',bucketSort(s))
排序前: [0.5508770121623574, 0.5105642435981665, 0.7407986153442134, 0.23604037267946876, 0.6047506017482288, 0.8917812667830698, 0.7672095143099116, 0.16869112783967, 0.5530897754416806, 0.9371483508584745, 0.21173144564210788, 0.25923868013393236]
排序后: [0.16869112783967, 0.21173144564210788, 0.23604037267946876, 0.25923868013393236, 0.5105642435981665, 0.5508770121623574, 0.5530897754416806, 0.6047506017482288, 0.7407986153442134, 0.7672095143099116, 0.8917812667830698, 0.9371483508584745]