算法说明

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

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

假如对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

最新文章

  1. 什么是WeakHashMap--转
  2. python知识:json格式文本;异常处理;字符串处理;unicode类型和str类型转换
  3. c# 中List&lt;T&gt; union 深入理解
  4. Linux系统中C&amp;Cpp程序开发(一)
  5. SQL Server 分离与附加数据库
  6. Android开发——签名包的生成
  7. [bzoj4151][AMPPZ2014]The Cave
  8. CentOS 安装Python3.x常见问题
  9. 【mac微信小助手】WeChatPlugin使用教程!
  10. 2016 安全圈玩起了直播,“学霸”带你玩转CTF_i春秋学院
  11. 【iCore1S 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入
  12. 接收Android数据 递归显示表格数据
  13. 《剑指offer》(第二版)Java实现
  14. LeetCode: 【L4】N-Queens 解题报告
  15. js实现字符串一个一个依次显示
  16. JavaScript可视化框架——Echarts
  17. UVa 12230 - Crossing Rivers(数学期望)
  18. 详细讲解 A/B 测试关键步骤,快来检查下还有哪些疏漏的知识点
  19. 分享一个基于 Node.js 的 Web 开发框架 - Nokitjs
  20. 转载 --iOS实用小技巧(2)-生成txt文本

热门文章

  1. RTSP RTSP(Real Time Streaming Protocol),RFC2326,实时流传输协议,是TCP/IP协议体系中的一个应用层协议
  2. cf.VK CUP 2015.B.Mean Requests
  3. php面试题之三——PHP网络编程(高级部分)
  4. Window_搭建SVN服务器
  5. 【Spring】Spring系列6之Spring整合Hibernate
  6. C语言指针总结
  7. maven项目 Java compiler level does not match the version of the installed Java project facet
  8. jQuery基础 - 改变CSS样式
  9. 查看Eclipse中的jar包的源代码:jd-gui.exe
  10. Android Studio中的Module,Facet