算法导论程序17-桶排序(Python)

桶排序:

假设输入数据服从均匀分布,平均情况下它的时间代价为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]


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值