Hark的数据结构与算法练习之桶排序
算法说明
桶排序的逻辑其实特别好理解,它是一种纯粹的分而治之的排序方法。
举个例子简单说一下大家就知道精髓了。
假如对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的数据结构与算法练习之桶排序相关推荐
- Hark的数据结构与算法练习之锦标赛排序
算法说明 锦标赛排序是选择排序的一种. 实际上堆排序是锦标赛排序的优化版本,它们时间复杂度都是O(nlog2n),不同之处是堆排序的空间复杂度(O(1))远远低于锦标赛的空间复杂度(O(2n-1)) ...
- Hark的数据结构与算法练习之圈排序
算法说明 圈排序是选择排序的一种.其实感觉和快排有一点点像,但根本不同之处就是丫的移动的是当前数字,而不像快排一样移动的是其它数字.根据比较移动到不需要移动时,就代表一圈结束.最终要进行n-1圈的比较 ...
- Hark的数据结构与算法练习之耐心排序
算法说明 耐心排序是插入排序的一种,至少wikipedia是这么分的. 话说我明白这个算法的实现思路了,但是不明白这么做的意义何在? 如果明白的朋友帮忙留个言说一下,以后如果我明白的话,我会来修改这个 ...
- Hark的数据结构与算法练习之珠排序
---恢复内容开始--- 算法说明 珠排序是分布排序的一种. 说实在的,这个排序看起来特别的巧妙,同时也特别好理解,不过不太容易写成代码,哈哈. 这里其实分析的特别好了,我就不画蛇添足啦. 大家看一 ...
- Hark的数据结构与算法练习之图书馆排序
算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...
- Hark的数据结构与算法练习之希尔排序
算法说明 希尔排序是插入排序的优化版. 插入排序的最坏时间复杂度是O(n2),但如果要排序的数组是一个几乎有序的数列,那么会降低有效的减低时间复杂度. 希尔排序的目的就是通过一个increment(增 ...
- Hark的数据结构与算法练习之计数排序
算法说明 计数排序属于线性排序,它的时间复杂度远远大于常用的比较排序.(计数是O(n),而比较排序不会超过O(nlog2nJ)). 其实计数排序大部分很好理解的,唯一理解起来很蛋疼的是为了保证算法稳定 ...
- python程序结构有哪几种_Python数据结构与算法(几种排序)小结
Python数据结构与算法(几种排序) 数据结构与算法(Python) 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺 ...
- 数据结构与算法:十大排序算法之归并排序
数据结构与算法:十大排序算法之归并排序 package TopTenSortingAlgorithms;/*** 归并排序:Java** @author skywang* @date 2014/03/ ...
最新文章
- idea 设置光标回到上一次位置的快捷键
- mysql--常用基础命令
- 管理系统中计算机应用第四章重点,管理系统中计算机应用课堂笔记第四章(4)...
- Winforn中设置ZedGraph曲线图的属性、坐标轴属性、刻度属性
- 通过电话号码获取姓名 (+86或者飞信)
- 删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm
- iOS:通信录(完成)(18-01-18更)
- 本周倔学 2019五月第三周
- 使用Jquery+CSS如何创建流动导航菜单-Fluid Navigation
- 科大讯飞携手华南理工,成立脑机接口公司,注册资本4000万
- sqlite 数据库 boolean类型的小小测试
- 简单输出斐波那契数列
- php薄饼,薄饼的做法大全
- 只读ppt如何获得可编辑版本?
- (Mix) The task phx.new could not be found
- 微信小程序获取系统时间、时间戳、时间时间戳加减
- MySQL的文本导入之load data local
- “永恒之蓝”第一弹-关于防范感染勒索蠕虫病毒的紧急通知
- 2022年美化UI二开某技术导航天下PHP源码
- 搜狗搜索推广Api在postman中的使用
热门文章
- Computer vision: models, learning and inference 学习笔记1:引言
- pthread_cond_init 初始化条件变量使用
- 再见,胡阿姨!再见,共享单车!
- 一万八的M1 iPad Pro ,怎么就成了“期货”
- Android之图片压缩
- 证券运维外包第3个月工作总结
- GCN的Python实现与源码分析
- 教你做一个微信添加好友收付款的个性二维码
- 互联网评论(一):由“戴尔用博客与中国用户沟通”想起
- java画图消除锯齿_java – JButton文本的消除锯齿