Java 桶排序实现 如何判断该放到哪个桶里
时间:2022-07-22
本文章向大家介绍Java 桶排序实现 如何判断该放到哪个桶里,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
桶排序 类似于计数排序所创建的统计数组,桶排序需要创建若干个桶来协助排序。
每一个桶代表一个区间范围,里面可以承载一个或多个元素。
再分别对每个桶里的元素进行排序 最后对桶集合进行遍历输出的就是有序数组
体现了分治思想
public void bucketSort(int[] array) {
int size = array.length;
int max = array[0], min = array[0];
for (int i = 1; i < size; i++) {
if (array[i] > max) max = array[i];
if (array[i] < min) min = array[i];
}
int bucketNum = size;//桶的数量
ArrayList<LinkedList<Integer>> bucketList = new ArrayList<>();
for (int i = 0; i < bucketNum; i++) {
bucketList.add(new LinkedList<>());
}
for (int i = 0; i < size; i++) {
//放到哪个桶
int num = (array[i] - min) * (bucketNum - 1) / (max - min);//重点
bucketList.get(num).add(array[i]);
}
for (int i=0;i<bucketNum;i++){
Collections.sort(bucketList.get(i));
}
int index = 0;
for (int i=0;i<bucketNum;i++){
System.out.println("桶"+i+"的元素数量:" + bucketList.get(i).size());
for (int n:bucketList.get(i)){
array[index++] = n;
}
}
}
其中
int num = (array[i] - min) * (bucketNum - 1) / (max - min); =偏移量 * (桶数量-1) / 差值 =偏移量 / ( 差值 / (桶数量-1) )
而 差值/(桶数量-1) 就是求出每个桶区间长度的公式
也就是说 取具体放到哪个桶的索引值的方法就是拿该元素的偏移量除以区间长度
每个桶中使用了jdk的归并排序。区间划分的越细,即桶的数量越多,理论上分到每个桶中的元素就越少,桶内数据的排序就越简单,其时间复杂度就越接近于线性。
极端情况下,就是区间小到只有1,即桶内只存放一种元素,桶内的元素不再需要排序,因为它们都是相同的元素,这时桶排序差不多就和计数排序一样了。
- 在ASP.NET MVC中使用Unity进行依赖注入的三种方式第一种方法第二种方法第三种方法
- Unity Container中的几种注册方式与示例1.实例注册2.简单类型注册
- 使用Unity创建依赖注入依赖注入生命周期:注册、解析、销毁 注册解析销毁
- 使用WCF进行跨平台开发之三(JAVA调用WCF服务)1.开发必备2.生成WCF客户端3.开发程序4.结束语
- 使用WCF进行跨平台开发之二(IIS托管WCF服务并使用php平台调用)1.系统必备2.在IIS中托管WCF服务3.使用PHP调用托管在IIS中的WCF服务
- 使用WCF进行跨平台开发之一(WCF的实现、控制台托管与.net平台的调用)1.创建项目结构2.契约的设计3.实现服务4.控制台托管服务5.在.net平台中调用WCF
- 使用GUI工具高效构建你自己的Nuget包丰富包的基础信息添加要包含的文件The end
- 网页结构与表现原则
- CSS3动画功能
- Angular开发者手册重点翻译之指令(一)文本和属性绑定ngAttr属性绑定
- CSS3中的变形处理
- WCF中操作的分界于调用顺序和会话的释放操作分界实例停止
- WCF中数据契约之已知类型的几种公开方式代码中定义配置中定义宿主端使用解析器
- 有趣的算法(一)——n阶层尾部有几个0
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 实习第七周
- 有赞 Android 崩溃保护的探索及实践
- 文章翻译:Node.js和Redis入门-安装与命令
- Angular的built-in指令
- 浅谈前端响应式设计(一)
- 浅谈前端响应式设计(二)
- 搭建简易的物联网服务端和客户端-redis+websocket(二十五)
- Angularjs下拉联动(2)
- 大数据开发平台(Data Platform)在有赞的最佳实践
- 【LeetCode两题选手】算法类题目(8.7)
- 树莓派2配置LAMP环境
- 实习第八周
- Office OpenXml SDK 使用 Fallback 图片显示 Ole 元素
- 直播平台在线人数功能
- ZanProxy —— 本地代码调试线上页面,环境再也不是问题