桶排序:(计数排序和基数排序)
基于数据状况的排序,需要知道数的范围,桶个数为数范围大小,先放进桶里,再倒回原数组。时间复杂度: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))