十大排序——9.桶排序

这篇文章我们来介绍一下桶排序

目录

1.介绍

2.代码实现

3.总结与思考


1.介绍

桶排序和计数排序一样,都不是基于比较进行排序的。

下面通过一个例子来理解一下桶排序吧。

首先,给你一个无序数组[ 20,18,28,66,25,31,67,30 ],然后,我们对其进行一个划分,比如十位数为1的放一起排,十位数为2的放一起排等等。结果就是我创造了10个桶,每个桶里面都放着十位数相同的那些数,然后,我在这些桶里再实现这些数据的有序性,然后,我再依次将这些数据取出来,这样就保证了数据的有序性。

下面看一下介绍:

桶排序(Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶里。每个桶再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来记得到有序序列。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(O(n))。但桶排序并不是比较排序,他不受到 O(n log n) 下限的影响。

基本思想

桶排序的思想近乎彻底的分治思想

桶排序假设待排序的一组数均匀独立的分布在一个范围中,并将这一范围划分成几个子范围(桶)。

然后基于某种映射函数 f ,将待排序列的关键字 k 映射到第 i 个桶中 (即桶数组 B 的下标 i ) ,那么该关键字 k 就作为 B[ i ] 中的元素 (每个桶B[ i ] 都是一组大小为 N/M 的序列 )。

接着将各个桶中的数据有序的合并起来 : 对每个桶B[ i ] 中的所有元素进行比较排序 (可以使用快排)。然后依次枚举输出 B[ 0 ] …. B[ M ] 中的全部内容即是一个有序序列。

补充: 映射函数一般是 f = array[ i ] / k; k^2 = n;n 是所有元素个数

为了使桶排序更加高效,我们需要做到这两点:

1、在额外空间充足的情况下,尽量增大桶的数量;
2、使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中;

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

实现逻辑

  • 设置一个定量的数组当作空桶子。
  • 寻访序列,并且把项目一个一个放到对应的桶子去。
  • 对每个不是空的桶子进行排序。
  • 从不是空的桶子里把项目再放回原来的序列中。

2.代码实现

下面看一下代码实现:

package Sorts;import java.util.*;//桶排
public class RadixSort {public static void main(String[] args) {int [] arr = new int[]{193,255,12,6,78,50,31,564};bucketSort(arr);;System.out.println(Arrays.toString(arr));}public static void bucketSort(int[] array) {if (array == null || array.length <= 1) {return;}// 建立桶,个数和待排序数组长度一样int length = array.length;LinkedList<Integer>[] bucket = (LinkedList<Integer>[]) new LinkedList[length];// 待排序数组中的最大值int maxValue = Arrays.stream(array).max().getAsInt();// 根据每个元素的值,分配到对应范围的桶中for (int i = 0; i < array.length; i++) {int index = toBucketIndex(array[i], maxValue, length);// 没有桶才建立桶(延时)if (bucket[index] == null) {bucket[index] = new LinkedList<>();}// 有桶直接使用bucket[index].add(array[i]);}// 对每个非空的桶排序,排序后顺便存入临时的List,则list中已经有序)List<Integer> temp = new ArrayList<>();for (int i = 0; i < length; i++) {if (bucket[i] != null) {Collections.sort(bucket[i]);temp.addAll(bucket[i]);}}// 将temp中的数据写入原数组for (int i = 0; i < length; i++) {array[i] = temp.get(i);}}private static int toBucketIndex(int value, int maxValue, int length) {return (value * length) / (maxValue + 1);}/***public static void sort(int arr[] ){//定义二维数组int [][] bucket = new int[10][arr.length];//定义记录桶中数据个数的数组int [] bucketElement = new int[10];for (int i = 0; i <arr.length ; i++) {int element = arr[i] % 10;bucket[element][bucketElement[element]] = arr[i];bucketElement[element]++;}int index = 0;for (int k = 0; k <bucketElement.length ; k++) {if (bucketElement[k]!=0){for (int l = 0; l <bucketElement [k] ; l++) {arr[index] = bucket[k][l];index++;}}bucketElement[k]=0;}}*/
}

注释的部分可能更好理解一点

3.总结与思考

桶排序是计数排序的变种,它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。把计数排序中相邻的m个”小桶”放到一个”大桶”中,在分完桶后,对每个桶进行排序(一般用快排),然后合并成最后的结果。

算法思想和散列中的开散列法差不多,当冲突时放入同一个桶中;可应用于数据量分布比较均匀,或比较侧重于区间数量时。

桶排序最关键的建桶,如果桶设计得不好的话桶排序是几乎没有作用的。通常情况下,上下界有两种取法,第一种是取一个10^n或者是2^n的数,方便实现。另一种是取数列的最大值和最小值然后均分作桶.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/624291.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

【网络安全】常见的网路安全设备及功能作用总结

常见的网路安全设备及功能作用总结 [一、 WAF 应用防火墙][二、IDS 入侵检测系统&#xff1a;][三、IPS 入侵防御系统&#xff08;入侵检测入侵防御&#xff09;][四、SOC 安全运营中心][五、SIEM 信息安全和事件管理][六、Vulnerability Scanner漏洞扫描器][七、UTM 统一威胁管…

强化学习(一)基础概念入门

文章目录 1. 什么是强化学习&#xff1f;2. 强化学习的基本元素3. 相关衍生元素3.1 策略(Policy)3.2 状态转移(State Transition)3.3 回报(Return)3.4 价值函数(Value Function) 4. 算法分类4.1 按环境是否已知划分4.2 按学习方式划分4.3 按学习目标划分 参考资料 1. 什么是强化…

网络流量中的准周期通信行为的分析和检测

论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S1005888511604408 论文源码&#xff1a;无 在电脑应用程序中&#xff0c;有一种一直运行的应用程序&#xff0c;该程序的网络流量也贯穿了用户整个使用时间。这些应用具有一种特殊的通信行为&…

C盘空间不够怎么办?

一。用foldersize看各目录占用空间大小 foldersize很多人可能都知道&#xff0c;不过网上多数能找到一些旧版的&#xff0c;在win10、win11上貌似不太好用&#xff0c;比如foldersize2.6版本&#xff0c;我是没整明白。。 解决办法很简单&#xff0c;直接去下最新版本的搞&am…

【web开发网页制作】html+css家乡长沙旅游网页制作(4页面附源码)

家乡长沙网页制作 涉及知识写在前面一、网页主题二、网页效果Page1、主页Page2、历史长沙Page3、著名人物Page4、留言区 三、网页架构与技术3.1 脑海构思3.2 整体布局3.3 技术说明书 四、网页源码HtmlCSS 五、源码获取5.1 获取方式 作者寄语 涉及知识 家乡长沙网页制作&#x…

Linux软件包管理器yum—1

目录 一、Linux下软件安装的方式 二、yum 2.1查看yum已配置的源&#xff1a; 2.2查看yum配置文件&#xff1a; 2.3使用root用户安装软件&#xff1a; 2.4模糊搜索 2.5安装软件&#xff1a; 2.6卸载软件&#xff1a; 2.7扩展源&#xff1a; 2.8yum源更新&#xff1a; 一…

IntelliJ IDEA2024 安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 IDEA&#xff08;Integrated Development Environment for Apache&#xff09; 是一款专为 Apache 开发者设计的集成开发环境。该软件提供了丰富的功能和工具&#xff0c;帮助开发者更高效地创建、调试和部署 Apache 项目。 主…

pta L1-027 出租

L1-027 出租 分数 20 全屏浏览 切换布局 作者 陈越 单位 浙江大学 下面是新浪微博上曾经很火的一张图&#xff1a; 一时间网上一片求救声&#xff0c;急问这个怎么破。其实这段代码很简单&#xff0c;index数组就是arr数组的下标&#xff0c;index[0]2 对应 arr[2]1&#x…

python--4函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、递归练习

学习目标&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 学习内容&#xff1a; 函数def,本质、值传递、引用传递、默认值参数、*参数名、**变量、lambda [参数]: 函数、偏函数、递归、 递归练习 …

微博聚类文本分析和可视化

本文使用python抓取微博数据并对微博文本分析和可视化&#xff0c;LDA&#xff08;树图&#xff09;、关系图、词云、时间趋势&#xff08;折线图&#xff09;、热度地图、词典情感分析&#xff08;饼图和3D柱状图&#xff09;、词向量神经网络情感分析、tfidf聚类、词向量聚类…

如何批量删除不包含指定关键字的数据行?

一、需求 有一个报名表&#xff0c;包括年龄&#xff0c;地址&#xff0c;特长等数据&#xff0c;现在想删除特长一列中不含“篮球”这个关键字行&#xff0c;可以使用这些办法。 二、删除数据 方法1.自动筛选&#xff0c; 1.1 选中数据后&#xff0c;点击数据选项卡&#…