排序算法 --- 桶排序
时间:2022-07-26
本文章向大家介绍排序算法 --- 桶排序,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、排序思想
之前将的计数排序,有些局限性,比如数列最大值和最小值差距不能太大,而且只能排整数。桶排序就对这些局限性做了弥补。桶排序的思想就是每个桶代表一个区间范围,里面可以装若干个元素。然后对这些桶内部进行排序,最后遍历这些桶,那么数列就是有序的了。
欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将简书文章搬到公众号,以后简书和公众号文章将同步更新,且简书上的付费文章在公众号上将免费。
1. 案例:
假如现在有如下数列:
4.5, 0.84, 3.25, 2.18, 0.5
- 首先创建与元素个数相同的桶,这里就创建5个桶;
- 最后一个桶让它只包含最大元素,即只包含4.5;
- 最大数是4.5,最小是0.5,间距是4,除去最后一个桶还有4个桶,所以每个桶间距是1,如下图:
桶排序
- 然后开始遍历原始数列,把元素放入对应的桶中,如下:
桶排序
- 对每个桶内部的元素进行排序,如下:
桶排序
- 最后遍历所有的桶,输出的元素就是有序的了。
桶排序的缺点:如果数据分布不均衡,比如最大值1000,最小值0.5,剩余元素都是零点几的,也就是说最后一个桶放最大元素,其他元素都在第一个桶,这样性能就会下降,并且创建了很多空桶,浪费空间。
二、代码实现
public static void sort(double[] arr){
if (arr == null || arr.length == 1){
return;
}
int arrNum = arr.length; // 元素个数
// 拿到最大数和最小数,用来确定间距
double max = arr[0];
double min = arr[1];
for (int i = 0; i < arrNum; i++) {
max = arr[i] > max ? arr[i] : max;
min = arr[i] < min ? arr[i] : min;
}
double distance = max - min;
// 创建 arrNum 个桶,桶用linkedList表示,因为linkedList是可重复的,待排数列可能有相同的元素
List<LinkedList<Double>> buckets = new ArrayList<>();
for (int i = 0; i < arrNum; i++) {
buckets.add(new LinkedList<>());
}
// 遍历原始数组,将每个元素放到桶中
for (int i = 0; i < arrNum; i++) {
// 判断该元素应该放入哪个桶中:当前元素减去最小值,乘以桶数量减一,再除以最大值减最小,得到的值就是桶编号
int num = (int)((arr[i] - min) * (arrNum - 1) / (max - min));
buckets.get(num).add(arr[i]);
}
// 对每个桶内部进行排序
for (int i = 0; i < buckets.size(); i++) {
Collections.sort(buckets.get(i));
}
// 最后遍历桶,输出所有元素
int i = 0;
for (LinkedList<Double> bucket : buckets){
for (double num : bucket){
arr[i++] = num;
}
}
}
- BaiduSubmit:度娘WordPress结构化数据插件(改进版)
- Android自绘动画实现与优化实战——以Tencent OS录音机波形动画为实例
- Go语言归并排序算法实现
- grep无法查找shell传过来的变量?先注意一下文本格式吧!
- 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?
- nwui —— 又一个go语言图形界面解决方案
- Golang 通用连接池
- 解决JS操作Cookies出现的乱码问题,修复WordPress评论乱码
- 分享一个WordPress外链跳转教程,兼容知更鸟暗箱下载和文章索引
- 让WordPress RSS/Feed订阅数据延迟发布,附RSS技巧集锦
- Linux系统防CC攻击自动拉黑IP增强版Shell脚本
- 利用artDialog给网站添加一个能显示搜索来路和关键词的欢迎框
- 解决启用wp super cache缓存后,页面追加多个斜杠仍然可以访问的隐患
- WordPress集成底部滚动推荐条,让好文章不再被埋没
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 历经14天自定义3个注解解决项目的3个Swagger难题
- 【一天一大 lee】秋叶收藏集 (难度:中等) - Day20201001
- 【译文】Facebook工程师谈运维工作的未来
- 【一天一大 lee】环形链表II (难度:中等) - Day20201010
- 【西法带你学算法】一次搞定前缀和
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
- 求求你别再用System.out.println 了!!
- 为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?
- 独家 | 教你用Python来计算偏差-方差权衡
- 使用 KinD 加速 CI/CD 流水线
- 使用 Docker 加速开发工作流
- Kubernetes CRD 自定义控制器
- 推荐算法之: LFM 推荐算法
- 推荐算法之: DeepFM及使用DeepCTR测试
- Cypress系列(61)- 断言最佳实践