算法说明

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

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

假如对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. jQuery特效

    基础特效 方法 描述 hide() 立即隐藏jQuery对象内的所有元素 hide(time).hide(time, easing) 在指定的时间内以动画方式隐藏jQuery对象内的所有元素,并可选一 ...

  2. 我的前端MVC之路

    大约十几个月前,了解到时下前端MVC之火爆,同事推荐我了解一下angular.当时也不是特别在意,只是稍稍阅读了一遍官方文档,并尝试了文档上的例子.其实当时也颇有震惊之感的,原来代码还可以这么写!看完 ...

  3. php设置cookie,在js中如何获取

    在php中设置cookie. $email="abc@163.com"; setcookie("y_email",$email,time()+3600,&quo ...

  4. Matlab之字符串处理

    Matlab处理字符串 1.取得部分字符串 我们有一个字符串 file='20131030_113109.TemporaryAlias.Poly5'; 简单操作举例: >> a=file( ...

  5. JVM是如何分配和回收内存?有实例!

    上一篇博客我简单介绍了下如何手动计算一个Java对象到底占用多少内存?今天就想聊下这个内存JVM到底是是如何分配和回收的. Java整体来说还是一个GC比较友好的语言,无论是分代的垃圾收集,还是基于G ...

  6. bitbucket新建分支

    /workspace/ott_app_store:fetch-xml$ git branch edit_package_page /workspace/ott_app_store:fetch-xml$ ...

  7. [POJ1936]All in All

    [POJ1936]All in All 试题描述 You have devised a new encryption technique which encodes a message by inse ...

  8. 什么是mixin

    转自:http://guangboo.org/2013/01/28/python-mixin-programming http://en.wikipedia.org/wiki/Mixin http:/ ...

  9. Solr DIH导入出现 Data Config problem: 前言中不允许有内容 异常

    Solr配置DIH导入时出现 “Data Config problem: 前言中不允许有内容.” 异常. <response> <lst name="responseHea ...

  10. coco2dx实现翻拍效果

    昨天吃饭看见同事演示他做的翻牌效果,感觉不错,我心血来潮也来搞个,很简单直接上代码. class FlipCard : public CCNode { public: CREATE_FUNC(Flip ...