java排序算法(十):桶式排序

桶式排序不再是一种基于比较的排序方法,它是一种比较巧妙的排序方式,但这种排序方式需要待排序的序列满足以下两个特征:

待排序列所有的值处于一个可枚举的范围之类;

待排序列所在的这个可枚举的范围不应该太大,否则排序开销太大。

排序的具体步骤如下:

(1)对于这个可枚举范围构建一个buckets数组,用于记录“落入”每个桶中元素的个数;

(2)将(1)中得到的buckets数组重新进行计算,按如下公式重新计算:

buckets[i] = buckets[i] +buckets[i-1] (其中1<=i<buckets.length);

桶式排序是一种非常优秀的排序算法,时间效率极高,它只要通过2轮遍历:第1轮遍历待排数据,统计每个待排数据“落入”各桶中的个数,第2轮遍历buckets用于重新计算buckets中元素的值,2轮遍历后就可以得到每个待排数据在有序序列中的位置,然后将各个数据项依次放入指定位置即可。

桶式排序的空间开销较大,它需要两个数组,第1个buckets数组用于记录“落入”各桶中元素的个数,进而保存各元素在有序序列中的位置,第2个数组用于缓存待排数据。

桶式排序是稳定的。

如果待排序数据的范围在0~k之间,那么它的时间复杂度是O(k+n)的

桶式排序算法速度很快,因为它的时间复杂度是O(k+n),而基于交换的排序时间上限是nlg n。

但是它的限制多,比如它只能排整形数组。而且当k较大,而数组长度n较小,即k>>n时,辅助数组C[k+1]的空间消耗较大。

当数组为整形,且k和n接近时, 可以用此方法排序。(有的文章也称这种排序算法为“计数排序”)

代码实现

  

  

最新文章

  1. docker版wordpress
  2. console对象-转
  3. FROM_UNIXTIME()和UNIX_TIMESTAMP()函数的区别
  4. 扩展SharePoint链接字段
  5. python 的一些小技巧
  6. 【SQLServer】使用T-SQL访问远程数据库:openrowset 和 openquery 以及连接服务器的创建
  7. Caused by: java.lang.ClassNotFoundException: javax.persistence.EntityListeners
  8. 多线程09-Lock和Condition
  9. 1.Asp.net处理请求的流程
  10. 【Android Studio安装部署系列】三、Android Studio项目目录结构
  11. CTFcracktools——非常实用的CTF解密工具
  12. Win10 开启移动热点 WiFi 的简单方法
  13. jquery单击事件的写法
  14. 解决UEFI启动模式下无法使用U盘启动WIN7安装界面
  15. 深入解密.NET(Tuple元祖)
  16. kubernets之endpoints
  17. Coursera公开课笔记: 斯坦福大学机器学习第六课“逻辑回归(Logistic Regression)” 清晰讲解logistic-good!!!!!!
  18. Java finalize以及Garbage Collection
  19. 前端的CRUD增删改查的小例子
  20. ElementUI select

热门文章

  1. Struts2实现文件上传报错(一)
  2. hi3531的pcie控制器使能
  3. 如何给filter添加自定义接口及调用
  4. EntityFramework Core 2.0 Explicitly Compiled Query(显式编译查询)
  5. 【NOIP2015】子串(动态规划)
  6. 【NOIP2013】华容道(最短路)
  7. 【Tyvj 1728】普通平衡树
  8. 【USACO4.2】草地排水Drainage Ditches(最大流)
  9. BSGS算法(大步小步算法)
  10. 异步解决方案promise及源码实现