排序算法-桶排序

落日映苍穹つ 2024-05-28 10:21 156阅读 0赞

一、桶排序

它同样是一种线性时间的排序算法,它类似于计数排序所创建的统计数组,桶排序需要创建若干个桶来协助排序。

每一个桶(bucket)代表一个区间范围,里面可以承载一个或多个元素。

如果有一个非整数数列如: 4.5,0.84,3.25,2.18,0.5

第1步,创建这些桶,并确定每一个桶的区间范围。

8a26a065e9ff444dbfbb2bf6a795be15.png

需要建立多少个桶,如何确定桶的区间范围,有很多种不同的方式。我们这里创建的桶数量等于原始数列的元素数量,除最后一个桶只包含数列最大值外,前面各个桶的区间按照比例来确定。

区间跨度=(最大值-最小值)/(桶的数量-1)

第2步,遍历原始数列,把元素对号入座放入各个桶中。

70bf200bfd53408880dc50b297ab9aca.png

第3步,对每个桶内部的元素分别进行排序(只有第1个桶需要排序)。
6640a9c0082e4279bea1da4b77f5a75a.png

第4步,遍历所有的桶,输出所有元素。

  1. def bucketSort(ll):
  2. # 1.得到数列的最大值,最小值
  3. max = ll[0]
  4. min = ll[0]
  5. for i in range(1, len(ll)):
  6. if ll[i] > max:
  7. max = ll[i]
  8. if ll[i] < min:
  9. min = ll[i]
  10. # 差值
  11. diff = max - min
  12. # print(diff)
  13. # 2.初始化桶
  14. bucket = []
  15. for i in range(len(ll)):
  16. bucket.append([]) #添加每个列表
  17. print(bucket)
  18. #3.遍历原数列,将每个元素放入桶中
  19. for i in range(len(ll)):
  20. #桶的索引
  21. num=int((ll[i]-min)*(len(ll)-1)/diff)
  22. #每个桶数列
  23. bt=bucket[num]
  24. # 将数据放入桶
  25. bt.append(ll[i])
  26. print(num,bt)
  27. #4.每个桶内部排序
  28. for i in range(len(bucket)):
  29. bucket[i].sort()
  30. print(bucket)
  31. #5.排序
  32. sort_list=[]
  33. #循环输出排序的元素
  34. for i in bucket:
  35. for j in i:
  36. sort_list.append(j)
  37. return sort_list
  38. if __name__ == '__main__':
  39. ll=[4.5,0.84,3.25,2.18,0.5]
  40. print(ll)
  41. print(bucketSort(ll))

a4bfa181ea8445c2be6fab0a9001ab7f.png

假设原始数列有n个元素,分成n个桶。

下面逐步来分析一下算法复杂度。

第1步,求数列最大值、最小值,运算量为n。

第2步,创建空桶,运算量为n。

第3步,把原始数列的元素分配到各个桶中,运算量为n。

第4步,在每个桶内部做排序,在元素分布相对均匀的情况下,所有桶的运算量之和为n。

第5步,输出排序数列,运算量为n。

因此,桶排序的总体时间复杂度为O (n)。 至于空间复杂度同样是O(n)

总之,具有代表性的排序算法如下:

47fcff8fee7a4232bb64b3c746834604.png

发表评论

表情:
评论列表 (有 0 条评论,156人围观)

还没有评论,来说两句吧...

相关阅读

    相关 排序算法 - 排序

    前言 桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使

    相关 算法排序

    计数排序、桶排序、基数排序均为O(n)算法 桶排序可以看成是计数排序的升级版,它将要排的数据分到多个有序的桶里,每个桶里的数据再单独排序,再把每个桶的数据依次取出,即可

    相关 排序算法-排序

    先创建若干个桶,每个桶存放不同范围的数据 桶和桶之间的跨度=(数据最大值-数据最小值)/ (桶的数量 - 1) 假设有一个数组:1.2,0.5,4.5,2.6,2.7

    相关 [算法]排序

    介绍 桶排序是分治算法的应用. 桶排序实际上就是把要排序的容器中的数据,分别按照大小跨度 分散在若干个桶中,如果桶中有一个以上的数据,则单独的桶进行 排序,最