桶排序

桶排序:(计数排序和基数排序)
基于数据状况的排序,需要知道数的范围,桶个数为数范围大小,先放进桶里,再倒回原数组。时间复杂度:O(N),空间复杂度O(N)。基于数据状况的排序,工程上很少用。
计数排序的实现:

def jishu_sort(arr):
    if arr==None and len(arr)<2:
        return
    bucket=[0 for i in range(max(arr)+1)]
    for i in range(len(arr)):#桶的每个位置用于计数
        bucket[arr[i]]+=1
    a = 0
    for i in range(len(bucket)):#将桶里的数倒回原数组中
        while bucket[i]>0:
            bucket[i] -= 1
            arr[a]=i
            a+=1
    return arr
arr=[3,1,3,5,8,9,7,8]
print(jishu_sort(arr))

应用:
求无序数组排好序后最大的相邻差值
分析:
利用桶排序思想,先求出最大值和最小值,准备(n+1)个桶,n为数组长度。
将范围平均分到每一个桶中,第一个和最后一个桶必有元素,中间必有空桶,所以在一个桶内的元素不可能是最大差值。即求相邻非空桶的后一个最小值减去前一个最大值。
代码:

def maxgap(arr):
    if len(arr)<2:
        return 0
    minn=min(arr)
    maxx=max(arr)
    if minn==maxx:
        return 0
    hasnumber=[0]*(len(arr)+1) #长度为n+1,保证中间必有空桶,答案不在桶内
    maxs=[0]*(len(arr)+1)          #三个数组,分别表示该桶的最大、最小、该桶是否有数
    mins=[0]*(len(arr)+1)
    for i in range(len(arr)):
        bid=bucket(arr[i],len(arr),minn,maxx)    #判断当前值属于哪一个桶
        if hasnumber[bid]==0:                           #判断每一个桶里的最大最小值
            mins[bid]=arr[i]
            maxs[bid]=arr[i]
        else:
            mins[bid]=min(arr[i],mins[bid])
            maxs[bid]=max(arr[i],maxs[bid])
        hasnumber[bid]=True #每个桶里是否有数
       
    res=0
    lastmax=maxs[0]
    for i in range(1,len(arr)+1):   #求最大差值
        if hasnumber[i]:                #判断是否为空桶
            res=max(mins[i]-lastmax,res)
            lastmax=maxs[i]
    return res
def bucket(num,len,min,max):                    #判断当前值属于哪一个桶
    return int((num-min)*len/(max-min))
   
arr=[3,4,7,2,5,15]
print(maxgap(arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值