桶排序:
假设输入数据服从均匀分布,平均情况下它的时间代价为O(n)。
桶排序假设输入是由一个随机过程产生,该过程将元素均匀、独立地分布在[0, 1)区间上。
桶排序将[0, 1)区间划分为n个相同大小的子区间,或称为桶(下面的程序中为列表B)。然后,将n个输入数分别放到各个桶中。因为输入数据是均匀独立地分布在[0, 1)区间上,所以一般不会出现很多数落在同一个桶的情况。
为了得到输出结果,我们先对每个桶中的数进行排序,然后遍历每个桶,按照次序把各个桶中的元素列出来即可。
import math
def bucket_sort(A):
n = len(A)
B = [[] for i in range(n)]
for i in range(0,n):
B[math.floor(n*A[i])].append(A[i])
for i in range(0,n):
insertion_sort(B[i])
del A[:]
for each in B:
A.extend(each)
def insertion_sort(A):
for j in range(1,len(A)):
key = A[j]
#Insert A[j] into the sorted sequence A[0..j-1].
i = j-1
while i>=0 and A[i]>key:
A[i+1] = A[i]
i = i-1
A[i+1] = key
运行结果:
>>> A=[0.78,0.17,0.39,0.26,0.72,0.94,0.21,0.12,0.23,0.68]
>>> bucket_sort(A)
>>> A
[0.12, 0.17, 0.21, 0.23, 0.26, 0.39, 0.68, 0.72, 0.78, 0.94]