【算法】不基于比较的排序(图解)

news/2025/1/14 0:42:15/

目录

1.比较器

2.桶排序

2.1.计数排序

2.2.基数排序

3.排序算法的稳定性及其汇总


1.比较器

返回负数的时候,第一个参数排在前面

返回正数的时候,第二个参数排在前面

返回0的时候,谁在前面都无所谓

@Override
public static void compare(Student o1, Student o2) {return o1.id - o2.id;
}

2.桶排序

2.1.计数排序

时间复杂度O(N)

假设我们要以年龄为基准对员工进行排序,首先初始化一个长度200的数组,索引为0的值表示0岁的员工有多少个,索引为1的值表示1岁的员工有多少个...把索引当作年龄,值当作人数,最后将辅助数组还原为原数组

桶排序是分配式排序,它利用数据的分布特征,将数据划分到不同桶中

2.2.基数排序

首先看最大的数字有几位,假设x位,那么把其他数字都补成x位,前面补0。

然后准备10个容器(桶),容器可以是数组队列等数据结构,我们以数组为例,把数据放入桶中

首先按照个位数字存入桶中

然后将数据返回原数组

接着按照十位数字存入桶中

然后将数据返回原数组

接着按照百位数字存入桶中

最后将数据返回原数组

public static void radixSort(int[] arr) {if (arr == null || arr.length < 2) {return;}radixSort(arr, 0, arr.length-1, maxbits(arr));
}
​
public static int maxbits(int[] arr) {int max = Integer.MIN_VALUE;for (int i = 0; i < arr.length; i++) {max = Math.max(max, arr[i]);}int res = 0;while (max != 0) {res++;max /= 10;}return res;
}
​
//所有元素入桶出桶多少次取决于最大元素的位数digit
public static void radixSort(int[] arr, int l, int r, int dight) {final int radix = 10;int i = 0, j = 0;//有多少个数准备多少个辅助空间int[] bucket = new int[r-l+1];for (int d = 1; d <= digit; d++) {//10个空间//count[0]当前位是0的数字有几个//count[1]当前位是1的数字有几个//...int[] count = new int[radix]; //count[0...9]for (i = l; i <= r; i++) {j = getDigit(arr[i], d);count[j]++;}for (i = 1; i < radix; i++) {count[i] = count[i] + count[i-1];}for (i = r; i >= l; i--) {j = getDigit(arr[i], d);bucket[count[j]-1] = arr[i];count[j]--;}for (i = l, j = 0; i <= r; i++, j++) {arr[i] = bucket[j];}}
}
​
public static int getDigit(int x, int d) {return ((x/((int) Math.pow(10, d-1)))% 10);
}

3.排序算法的稳定性及其汇总

稳定性:值相同的个体之间,如果不因为排序而改变相对次序,就说这个排序是有稳定性的,否则就没有稳定性,即值相同的时候,拍完序之后能否保持相对顺序不变

不具备稳定性的排序:

选择排序、快速排序、堆排序

具备稳定性的排序:

冒泡排序、插入排序、归并排序、一切桶排序思想下的排序

目前没有找到时间复杂度O(N*logN),额外空间复杂度O(1),又稳定的排序

为什么要考虑稳定性?

在非基础类型数据排序时,例如学生信息数组中,每个学生对象有age字段和class字段,先对class字段排序,排序后再根据age字段排序,此时要考虑稳定性以确保class有序

基于比较的排序,时间复杂度无法到O(N*logN)以下

时间复杂度在O(N*logN)的排序,空间复杂度O(N)以下则没有稳定性


http://www.ppmy.cn/news/1562917.html

相关文章

Spring 中的常用注解

Spring 作为 Java 企业级开发中最广泛使用的框架之一&#xff0c;以其强大的功能和灵活性为开发者提供了高效的开发体验。在 Spring 中&#xff0c;注解&#xff08;Annotation&#xff09;是其核心机制之一&#xff0c;它简化了配置文件的繁琐操作&#xff0c;通过声明的方式实…

机器学习 - 如何理解函数集合中的准确性、召回率、F1分数呢?

在机器学习中&#xff0c;准确性&#xff08;Accuracy&#xff09;、召回率&#xff08;Recall&#xff09;、和F1分数是常用的模型性能评价指标&#xff0c;它们从不同的角度衡量模型的表现。要理解它们&#xff0c;首先需要了解它们的定义和适用场景&#xff1a; 1. 基本概念…

制造业该怎么做数据治理?

什么是数据治理&#xff1f; 简单来说&#xff0c;数据治理就是管好企业的数据家底&#xff0c;就像管家一样&#xff0c;得有规划、有监督、还得落实执行。目标就是让数据在整个生命周期里都保持高质量、合规合法、安全可靠、用起来方便。这可不光是收集、存储和使用数据那么…

用 Python 绘制可爱的招财猫

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​​​​ ​​​​​​​​​ ​​​​ 招财猫&#xff0c;也被称为“幸运猫”&#xff0c;是一种象征财富和好运的吉祥物&#xff0c;经常…

【深度学习之PyTorch】

目录 一、什么是PyThon&#xff1f; 二、张量的创建 2.1 指定数据创建 2.2 指定形状、指定数据创建 2.3 创建指定类型的张量 2.4 创建线性张量 2.5 创建随机张量 2.6 创建全0张量 2.7 创建全1张量 2.8 创建指定张量 2.9 总结 三、张量的类型转换 3.1 张量元素的类型转…

加强移动应用安全,应用加固不可或缺

随着移动设备的普及&#xff0c;手机应用已经成为我们生活中不可或缺的一部分。无论是在线购物、银行支付&#xff0c;还是日常通讯、娱乐&#xff0c;移动应用都在处理中大量敏感数据&#xff0c;这使得它们成为网络攻击者的主要目标。针对这一不断加剧的安全威胁&#xff0c;…

109周四复盘 (183)慢速

1、关键词&#xff1a; 战斗体验、慢速 2、昨晚新增了伤害数值UI&#xff0c;虽然只是简单的数字动画&#xff0c;但对打击感还是有所帮助的。 3、白天主要是某关卡的战斗体验优化&#xff0c; 起初的版本问题很多&#xff0c;但一直没有下决心去彻底解决&#xff0c;各种杂事…

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…