算法说明

桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法。

举个例子简单说一下大家就知道精髓了。

假如对11,4,2,13,22,24,20 进行排序。

那么,我们将4和2放在一起,将11,13放在一起,将22,24,20放在一起。  然后将这三部分分别排序(可以根据实现情况任意选择排序方式,我的代码中使用的是快排),将子数组排序后,再顺序输出就是最终排序结果了(大概应该明白了,我们是根据数字大小进行分组的,故而顺序输出即可)

怎么样,很简单吧。

具体实现大家看代码就行,我实现的其实有许多可以优化的地方呐。

代码

使用的是java

另外,以下代码中的第44行代码 QuickSort.QuickSortMethod(arrayBucket[i]); 调用的是 这里 的方法

import java.util.Arrays;/** 桶排序*/
public class BucketSort {public static void main(String[] args) {int[] arrayData = { 22, 33, 57, 55, 58, 77, 44, 65, 42 };BucketSortMethod(arrayData, 10);for (int integer : arrayData) {System.out.print(integer);System.out.print(" ");}}/** buckenCount - 桶的数量*/public static void BucketSortMethod(int[] arrayData, int buckenCount) {int[][] arrayBucket = new int[buckenCount][arrayData.length]; // 桶容器for (int i = 0; i < arrayBucket.length; i++) {for (int j = 0; j < arrayBucket[i].length; j++) {arrayBucket[i][j] = -1;}}int[] arrayLength = new int[arrayData.length];int num;// 将数据分桶for (int i = 0; i < arrayData.length; i++) {// 根据结果来确定是存在在哪个桶中num = arrayData[i] / buckenCount;num = 10 - num; // 这是为了降序// System.out.println(num);arrayBucket[num][arrayLength[num]] = arrayData[i];arrayLength[num]++;}// 将桶内数据进行排序,这里使用的是快排for (int i = 0; i < arrayBucket.length; i++) {QuickSort.QuickSortMethod(arrayBucket[i]);}int resultIndex = 0;// 对于桶内的数据进行输出for (int i = 0; i < arrayBucket.length - 1; i++) {if (arrayLength[i] > 0) {for (int j = 0; j < arrayBucket[i].length; j++) {if (arrayBucket[i][j] != -1) {arrayData[resultIndex++] = arrayBucket[i][j];}}}}}
}

结果

77 65 58 57 55 44 42 33 22

时间复杂度:

时间复杂度主要还是取决于子数组的排序时间复杂度。 子数组的排序复杂度平均是O(n*log2n),然后分桶这块的的空间复杂度是O(n)

即O(n+n*log2n)

空间复杂度:

假设桶的数量是b,待排序数组的长度是n。

那么O(b*n)=O(n)

稳定性:稳定性主要取决于子数组中的排序(即44行调用的快排),子数组中使用的排序方法是稳定的,那么桶排序就是稳定的。

参考

http://flyingcat2013.blog.51cto.com/7061638/1286645

转载于:https://www.cnblogs.com/hark0623/p/4352692.html

Hark的数据结构与算法练习之桶排序相关推荐

  1. Hark的数据结构与算法练习之锦标赛排序

    算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...

  2. Hark的数据结构与算法练习之圈排序

    算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...

  3. Hark的数据结构与算法练习之耐心排序

    算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...

  4. Hark的数据结构与算法练习之珠排序

    ---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦.  大家看一 ...

  5. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  6. Hark的数据结构与算法练习之希尔排序

    算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...

  7. Hark的数据结构与算法练习之计数排序

    算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...

  8. python程序结构有哪几种_Python数据结构与算法(几种排序)小结

    Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...

  9. 数据结构与算法:十大排序算法之归并排序

    数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...

最新文章

  1. idea 设置光标回到上一次位置的快捷键
  2. mysql--常用基础命令
  3. 管理系统中计算机应用第四章重点,管理系统中计算机应用课堂笔记第四章(4)...
  4. Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性
  5. 通过电话号码获取姓名 (+86或者飞信)
  6. 删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm
  7. iOS:通信录(完成)(18-01-18更)
  8. 本周倔学 2019五月第三周
  9. 使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
  10. 科大讯飞携手华南理工,成立脑机接口公司,注册资本4000万
  11. sqlite 数据库 boolean类型的小小测试
  12. 简单输出斐波那契数列
  13. php薄饼,薄饼的做法大全
  14. 只读ppt如何获得可编辑版本?
  15. (Mix) The task phx.new could not be found
  16. 微信小程序获取系统时间、时间戳、时间时间戳加减
  17. MySQL的文本导入之load data local
  18. “永恒之蓝”第一弹-关于防范感染勒索蠕虫病毒的紧急通知
  19. 2022年美化UI二开某技术导航天下PHP源码
  20. 搜狗搜索推广Api在postman中的使用

热门文章

  1. Computer vision: models, learning and inference 学习笔记1:引言
  2. pthread_cond_init 初始化条件变量使用
  3. 再见,胡阿姨!再见,共享单车!
  4. 一万八的M1 iPad Pro ,怎么就成了“期货”
  5. Android之图片压缩
  6. 证券运维外包第3个月工作总结
  7. GCN的Python实现与源码分析
  8. 教你做一个微信添加好友收付款的个性二维码
  9. 互联网评论(一):由“戴尔用博客与中国用户沟通”想起
  10. java画图消除锯齿_java – JButton文本的消除锯齿