计数排序其实本质上就是一种桶,只不过每个桶对应一个数值,可以理解为桶排序的一种最原始情况,而桶排序是计数排序的升级版,他的桶对应是一个映射区间,而不是一个值,如下图:

  • 图片来源:桶排序
      而后在桶内完成排序,最后将各个桶连接起来,完成排序。该算法很容易理解,但是其高效与否取决于两个部分,一个是映射空间的划定,最好的情况是n个数组均匀的划分到k个桶中,最坏的情况是输入的数组分配到了同一个桶中;第二个是桶内排序算法的选择,本文基于python的内置是Timsort排序算法实现,Timsort排序算法以后有机会在讲讲,该算法可以简单地理解为一种插入排序和归并排序的结合算法,当排序序列较小时(小于64)使用插入排序,大于64时,先拆分为多个长度小于等于64的序列,在进行归并。代码如下所示:
import math
def bucketSort(nums, bucketSize):ans = []buckets = [[]for _ in range(bucketSize)]#寻找数组最大值和最小值maxValue, minValue = nums[0], nums[0]for n in nums:if n > maxValue:maxValue = nif n < minValue:minValue = n#将数值映射到桶中#计算步长,一定要向上取整,否则最大值可能会超出桶边界step = math.ceil(float(maxValue - minValue)/bucketSize)for n in nums:bucketIndex = (n - minValue)//stepbuckets[bucketIndex].append(n)  for bucket in buckets:ans.extend(sorted(bucket))return ansnums = [3,38, 5, 44, 15, 36]
bucketSort(nums, 3)
  • 可以看出桶排序额外维护了两个数组,一个桶一个新的排序序列,空间复杂度为O(n+k),k为桶的数量。关于时间复杂度,两个循环分别分析,第一个是n次遍历找到最大值和最小值,第二个循环是n次遍历,将元素放到对应的桶中,第三个循环是分别对桶进行排序,如果不计桶内排序时间,循环次数为k,那么如果不知道最大值最小值的情况下,时间复杂度为O(2n+k),如果知道是O(n+k),最坏时间复杂度是所有元素在一个桶中,这时候相当于对全元素进行插入排序,时间复杂度为O(n2),由于桶内排序算法是插入排序,而插入排序是一种稳定算法,因此内部排序为插入排序算法的桶排序也是一种稳定排序算法。

排序算法专题-桶排序相关推荐

  1. 排序算法:桶排序、计数排序、基数排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 这篇博客将主要介绍三种时间复杂度是 ...

  2. 排序算法之--桶排序(桶,像桶一样的排序,听起来很有趣哦0。0)

    排序算法之--桶排序 桶排序的工作的原理是将数组分到有限数量的桶子里,而这个有限数量是指多少个呢? 不急,容我细细道来:我们可以先求出这个数组的最大值和最小值,那么桶的数量就是max-min+1咯 为 ...

  3. 常用排序算法(八)桶排序

    桶排序 概要 本章介绍排序算法中的桶排序.内容包括: 1. 桶排序介绍 2. 桶排序图文说明 3. 桶排序实现 3.1  桶排序C实现 3.2  桶排序C++实现 3.3  桶排序Java实现 转载请 ...

  4. c语言桶排序,排序算法之——桶排序

    这是本人的第一篇随笔,为的是分享学习经验,和大家讨论一些算法,以便取得些许进步,也是对学习的总结. 话不多说,下面我会用图文的方式向各位介绍桶排序. 1.主要思想: 桶排序的大体思路就是先将数组分到有 ...

  5. 排序算法_桶排序(箱排序)

    一.算法描述 假设有一组长度为N的待排关键字序列K[1....n]. 首先将这个序列划分成M个的子区间(桶). 然后基于某种映射函数 ,将待排序列的关键字k映射到第i个桶中(即桶数组B的下标 i) , ...

  6. 排序算法(7)----桶排序

    桶排序:  * 计数排序适合小范围的大量重复元素,而桶排序适合区间内尽可能随机的元素  * 它的思想是: * 把数据存在的区间划分为小的区间,就像桶一样,这些在一个桶中的数据在桶内排好序,再合并成排序 ...

  7. 经典白话算法之桶排序

    最快最简单的排序--桶排序 在我们生活的这个世界中到处都是被排序过的.站队的时候会按照身高排序,考试的名次需要按照分数排序,网上购物的时候会按照价格排序,电子邮箱中的邮件按照时间排序--总之很多东西都 ...

  8. java 桶排序_[图解] 桶排序

    桶排序是一种排序的思想,其实现包括计数排序和基数排序两种,冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序都是基于比较的排序,而桶排序提出了一种新的思路,即基于数据状态的排序. 1. 桶排序的 ...

  9. 【每日算法】桶排序算法

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

  10. 排序算法之计数排序、基数排序和桶排序

    转自:http://www.cnblogs.com/ttltry-air/archive/2012/08/04/2623302.html 计数排序,基数排序,桶排序等非比较排序算法,平均时间复杂度都是 ...

最新文章

  1. conda常用命令整理
  2. 2014\Province_C_C++_B\6 奇怪的分式
  3. C++string容器-插入和删除
  4. 大厂面试:一个四年多经验程序员的BAT面经
  5. 诗与远方:无题(七十一)- 雨季来了
  6. (12)H5新增语义化标签布局案例
  7. LightGBM常用模板
  8. 关于VC9和VC6以及Thread Safe和Non Thread Safe版本选择的问题
  9. ClassLoader类加载器简介
  10. android fsck,android fsck_msdos分析(一)
  11. (转载)IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?
  12. 挖掘有多深,舞弊就有多大,孙德顺敛财10亿,看图计算如何穿透与识别多层嵌套影子公司!...
  13. 软件工程师之路-软考(中级)1
  14. 数据结构求子串、非空子串、真子串、非空真子串数
  15. ArcGIS制作栅格动图
  16. 好消息,个人也可以申请支付宝支付了
  17. 蜘蛛大战之 站点LOGO(SEO)
  18. 从libc-2.27.so[7ff3735fd000+1e7000]崩溃回溯程序段错误segfault
  19. 一个有趣的反病毒软件测试
  20. 统计学~方差分析【第十周】

热门文章

  1. 22. 切勿直接修改set或multiset中的键
  2. mysql 流浪,流浪汉机器 – 如何找出mysql用户名/密码
  3. (day 11 - 模拟)剑指 Offer 29. 顺时针打印矩阵
  4. 高级python_高级Python功能
  5. python输入长和宽计算面_python案例1
  6. Django:django.db.utils.OperationalError: (1050, “Table ‘malicious_software_db‘ already exists“)
  7. Node:根据开发环境配置axios默认路径
  8. Java编程:排序算法——快速排序
  9. java date truncate_Java DateUtils.truncate方法代码示例
  10. 面板x轴模式包括哪些_虎扑轻跃 | 体验一汽大众探岳X