算法说明

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

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

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

Hark的数据结构与算法练习之桶排序的更多相关文章

  1. JavaScript 数据结构与算法之美 - 桶排序、计数排序、基数排序

    1. 前言 算法为王. 想学好前端,先练好内功,只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算 ...

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

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

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

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

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

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

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

    算法说明 Bogo排序是交换排序的一种,它是一种随机排序,也是一种没有使用意义的排序,同样也是一种我觉得很好玩的排序. 举个形象的例子,你手头有一副乱序的扑克牌,然后往天上不停的扔,那么有一定机率会变 ...

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

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

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

    算法说明梳排序是交换排序的一种,它其实也是改自冒泡排序,不同之处是冒泡排序的比较步长恒定为1,而梳排序的比较步长是变化的. 步长需要循环以数组长度除以1.3,到最后大于等于1即可. 光说可能比较抽象, ...

  8. Hark的数据结构与算法练习之奇偶排序

    算法说明 奇偶排序又叫奇偶换位排序,砖排序.它是一种交换排序,也是冒泡的一个变种 顾名思义,奇偶排序,其实就是先循环奇数位,然后将奇数位与偶数位比较计算. 然后再循环偶数位,再和奇数位比较运算.看一下 ...

  9. Hark的数据结构与算法练习之鸡尾酒排序

    算法说明 鸡尾酒排序又叫定向冒泡排序,鸡尾酒搅拌排序,搅拌排序,涟漪排序,回来排序,快乐小时排序. 鸡尾酒排序是交换排序的一种,它是冒泡排序的一个轻微的变种.冒泡是从低向高比较排序,鸡尾酒从低向高,从 ...

随机推荐

  1. css实现固定高度及未知高度文字垂直居中的完美解决方案

    在工作当中我们经常碰到类似于"固定高度文字垂直居中及未知高度垂直居中问题",或者 "图片垂直居中问题",而我们最容易会想到使用表格来垂直居中,或者如果是单行文字 ...

  2. 聊下并发和Tomcat线程数(Updated)

    最近一直在解决线上一个问题,表现是: Tomcat每到凌晨会有一个高峰,峰值的并发达到了3000以上,最后的结果是Tomcat线程池满了,日志看很多请求超过了1s. 服务器性能很好,Tomcat版本是 ...

  3. 避免使用CSS表达式

    http://www.cnblogs.com/chenxizhang/archive/2013/05/01/3053439.html 这一篇我来和大家讨论个原则:Avoid CSS Expressio ...

  4. iphone数据存储之-- Core Data的使用(一)

    http://www.cnblogs.com/xiaodao/archive/2012/10/08/2715477.html 一.概念 1.Core Data 是数据持久化存储的最佳方式 2.数据最终 ...

  5. python4delphi Python could not be properly initialized. We must quit.

    要用32位的DLL,不要用64位的dll Unable to load Python 2.7 dll with Delphi 2010 #6  Closed GoogleCodeExporter op ...

  6. Python获取目录、文件的注意事项

    Python获取指定路径下的子目录和文件有两种方法: os.listdir(dir)和os.walk(dir),前者列出dir目录下的所有直接子目录和文件的名称(均不包含完整路径),如 >> ...

  7. 【SpringMVC】SpringMVC系列3之@PathVariable映射URL占位符参数

    3.@PathVariable映射URL占位符参数 3.1.概述 带占位符的 URL 是 Spring3.0 新增的功能,该功能在SpringMVC 向 REST 目标挺进发展过程中具有里程碑的意义. ...

  8. Maven发布web项目到tomcat

    在java开发中经常要引入很多第三方jar包:然而无论是java web开发还是其他java项目的开发经常会由于缺少依赖包引来一些不必要的异常.常常也是因为这样的原因导致许多简单的缺包和版本问题耗费大 ...

  9. iOS 中constraint 不等于约束和低优先级约束使用的简单体会

    看了些文章发现,在使用constraint时,不等于约束往往是和低优先级约束成对使用的,这样才能实现他们的效果. 看看例子 下面是在3.5存屏幕下的效果 图1,竖屏,在满足>=50的前提下,可以 ...

  10. Windows下的cmd命令行中设置环境编码

    我们都知道,Windows下的cmd命令行默认编码是Windows系统的编码,就是ANSI编码或者说是GBK编码的,这样我们编写的很多应用比如php编写utf-8编码的应用在命令行下面运行时都会出现乱 ...