Java关于桶排序的知识点总结
作者:laozhang 发布时间:2023-12-06 03:18:04
前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督。本文从最简单的一个排序算法——桶排序开始,分析桶排序的实现思路,代码实现,性能特点以及适用场景。
0、其他排序算法索引
https://www.jb51.net/article/120879.htm
1、桶排序思想
一个简单例子:
对6个人的英语测试成绩(1~10分)进行排序。假如分数是[6,5,8,8,10,9],用桶排序的思想就是准备10个桶,编号依次为1~10,将成绩放入对应的桶中,例如6分放入6号桶,两个8分放入8号桶...然后按照桶的标号顺序逐一输出(有就输出,没有就不输出),这就是桶排序的基本思想。
事实上,这只是一个简易版,试想一下,如果待排序的元素跨度范围比较大,例如1~10000,是不是需要10000个桶?实际上这种情况下,一个桶里并非总放一个元素,很多时候一个桶里放多个元素。其实真正的桶排序和散列表有一样的原理。
实际排序中,通常对每个桶中的元素继续使用其他排序算法进行排序,所以更多时候,桶排序会结合其他排序算法一起使用。
2、桶排序代码
在分析了桶排序的思想后,首先要知道待排序元素的范围,以上述为例,声明一个长度为10的数组作为10个桶,然后将成绩逐一往桶中放时,该桶的值+1,最终输出倒序输出数组下标,数组每个位置的值为几就输出几次,这样就能实现基本的桶排序。
public class BucketSort {
private int[] buckets;
private int[] array;
public BucketSort(int range,int[] array){
this.buckets = new int[range];
this.array = array;
}
/*排序*/
public void sort(){
if(array!=null && array.length>1){
for(int i=0;i<array.length;i++){
buckets[array[i]]++;
}
}
}
/*排序输出*/
public void sortOut(){
//倒序输出数据
for (int i=buckets.length-1; i>=0; i--){
for(int j=0;j<buckets[i];j++){
System.out.print(i+"\t");
}
}
}
}
测试代码:
public class SortTest {
public static void main(String[] args) {
testBucketsSort();
}
private static void testBucketsSort(){
int[] array = {5,7,3,5,4,8,6,4,1,2};
BucketSort bs = new BucketSort(10, array);
bs.sort();
bs.sortOut();//输出打印排序
}
}
3、桶排序性能特点
桶排序实际上只需要遍历一遍所有的待排元素,然后依次放入指定的位置。如果加上输出排序的时间,就要遍历所有的桶。因此桶排序的时间复杂度是O(n+m),n是待排元素的个数,m是桶的个数,也就是待排元素的范围。这个算法算是相当快的排序算法了,但是空间复杂度比较大。
当待排元素的大小范围比较大,但待排元素个数比较少时,空间浪费就比较严重,待排元素分布月均匀,空间利用率越高,事实上这种情况很少见。
通过以上性能分析,可以得出桶排序的特点:速度快且简单,但同时空间利用率较低。当待排数据跨度很大时,空间利用率是无法忍受的。
4、桶排序适用场景
根据桶排序的特点,桶排序一般适用于一些特定的环境,比如数据范围较为局限或者有一些特定的要求,比如需要通过哈希映射快速获取某些值,需要统计每个数的数量。但是这一切都以确认数据的范围为前提,如果范围跨度过大,则考虑用其他算法。


猜你喜欢
- 字符串采用unicode编码的方式时,计算字符串长度的方法找出UNICODE编码中的汉字的代表的范围“\u4E00” 到“\u9FBB”之间
- bean的定义继承bean定义可以包含很多的配置信息,包括构造函数的参数,属性值,比如初始化方法,静态工厂方法名等容器的具体信息。子bean
- 一、概述顶部ViewPager指示器的字体变色,该效果图是这样的:大概是今天头条的app,神奇的地方就在于,切换ViewPager页面的时候
- 1.概述最近一直都在带实习生做项目,发现自己好久没有写博客了,这几天更新会比较频繁,今天玩QQ的时候发现QQ主页菜单滑动效果早就变了,实在忍
- 在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接。2)打车过去。3)机
- 前言在unity的ugui中Text控件,有时我们会有各种各样的需求,比如类似html中css的text-overflow属性,希望一段文字
- 首先 函数指针是指向一组同类型的函数的指针;而类成员函数我们也可以相似的认为,它是指向同类中同一组类型的成员函数的指针,当然这里的成员函数更
- 本文实例讲述了Android Dialog对话框用法。分享给大家供大家参考,具体如下:Activities提供了一种方便管理的创建、保存、回
- C#调用dll报错:无法加载dll,找不到指定模块最近在做一个swmm模型的项目,在swmm源码上进行改写了两个函数,结果调用的时候就报错了
- 前言在我们用户登录的时候,为了安全性考虑,会增加验证码的功能,这里采用的是google的kaptcha;spirngboot是轻便,独立,使
- 目录Shiro简介Shiro快速入门SpringBoot-Shiro整合(最后会附上完整代码)附上最后的完整代码Shiro整合mybatis
- 1、什么是Spring MVC?Spring MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用
- 前言昨夜同门云集推杯又换盏,今朝茶凉酒寒豪言成笑谈。半生累,尽徒然,碑文完美有谁看,隐居山水之间誓与浮名散。简介今天给大家带来的是支付宝的月
- 本文实例为大家分享了Viewpager2实现登录注册引导页面的具体代码,供大家参考,具体内容如下介绍屏幕滑动是两个完整屏幕之间的切换,在设置
- 目录1. 结论先出JSR 380Valid VS Validated 不同点?Validator2. @Valid和@Validated 注
- 流程如图:MainActivity 跳转至 MainActivity2 再跳转至 MainActivity3MainActivity3跳转至
- 继承ClassLoader并且重写findClass方法就可以自定义一个类加载器,具体什么是类加载器以及类加载器的加载过程与顺序下次再说,下
- WPF中的ObservableCollection是一个非常常用的集合对象,我们可以通过将它绑定到ListBox之类的集合控件上时,当集合发
- 一、理解 “ 服务器 / 浏览器 ”沟通流程(3步)第1步:浏览器使用<img src=&qu
- yml与properties其实yml和properties文件是一样的原理,且一个项目上要么yml或者properties,二选一的存在。