排序——非基于比较的排序

本专栏和大家分享关于排序的算法,其中有插入排(直接插入排序和希尔排序)、选择排序(直接选择排序和堆排)、交换排序(冒泡排序和快速排序)、归并排序以及其他非基于比较的排序

本文与大家分享非基于比较的排序

目录

计数排序

步骤:

基数排序

具体步骤如下

桶排序

感谢您的访问!!期待您的关注!!!


计数排序

步骤:

  1. 统计相同元素出现次数

  2. 根据统计的结果将序列回收到原来的序列中

当数据基本集中在某一个范围时,推荐使用计数排序

本质就是

我们对原数组进行遍历,每次将count[arr[i] - min]++,最后就会得到:

实际上我们在上面对count赋值的操作就已经将数组排序好了,此时,count数组的下标 + min 就是原来在array里面的元素,下标对应的值就是该元素出现的个数

 public static void countSort(int[] array){int max = array[0];int min = array[0];for (int i = 1; i < array.length; i++) {if(max < array[i]){max = array[i];}if(min > array[i]){min = array[i];}}int[] count = new int[max - min + 1];for (int i = 0; i < array.length; i++) {count[array[i] - min]++;}​int k = 0;for(int i = 0; i < count.length; i++){while(count[i] != 0){array[k++] = i + min;count[i]--;}}}

时间复杂度:O(范围+N)

其中范围=max - min,最好集中一点

空间复杂度:O(范围)

稳定性:稳定


基数排序

具体步骤如下

假设我们有如上图所示的数组,我们需要准备10个容器

首先,我们要根据数组每一个元素的个位上的数字,将元素放到对应的容器里面

再按顺序出来

此时就会发现,所有的数据已经"根据个位"排好序了,那么我们就按照"十位"的数字再次进行同样的操作

再按照个位:

最终得到的就是有序的

 public class RadixSort {public static void radixSort(int[] array){int max = array[0];for(int i = 0; i < array.length; i++){if(max < array[i]){max = array[i];}}int count = (int)Math.log10(max) + 1;Queue<Integer>[] lists = new LinkedList[10];for(int i = 0; i < 10; i++){lists[i] = new LinkedList<>();}for(int i = 0; i < count; i++){for (int j = 0; j < array.length; j++) {int k = (i == 0 ? array[j] % 10 : (array[j] / (int)Math.pow(10,i) % 10));lists[k].offer(array[j]);}int index = 0;for(int j = 0; j < lists.length;j++){int n = lists[j].size();while(n != 0){n--;array[index++] = lists[j].poll();}}}}}
 

桶排序

实际上是计数排序的优化版

假设我们的数组是这样的,在桶排序里面,我们需要建立多个桶,每个桶存放一定范围的数据,再针对每个通进行排序,最后再把桶里的数据拿出来

我们首先要考虑的是桶的个数,假设我们每个桶放10个元素,在上面的数据中,最大值max = 821.最小值min=28,我们可以利用公式(max - min) / 10 + 1,得到桶的个数

接下来我们即利用元素与下标的映射关系将元素放到对应的桶里面去,映射关系为index = (array[i] - min) / 10,

再针对每个桶进行排序,再将桶里的元素拿出来即可

代码:

 public class BucketSort {public static void bucketSort(int[] array){int max = array[0];int min = array[0];for (int x : array){max = Math.max(x,max);min = Math.min(x,min);}int n = (max - min) / 10 + 1; //每个桶放10个元素List<Integer>[] lists = new ArrayList[n];for(int i = 0; i < n; i++){lists[i] = new ArrayList<>();}for(int i = 0; i < array.length; i++){int index = (array[i] - min) / 10;lists[index].add(array[i]);}for(int i = 0; i < n; i++) {Collections.sort(lists[i]);}int k = 0;for(int i = 0; i < n; i++){int size = lists[i].size();for(int x : lists[i]){array[k++] = x;}}}}

感谢您的访问!!期待您的关注!!!

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

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

相关文章

MySQL学习之连接查询

笛卡尔乘积现象 在表的连接查询方面有一种现象被称为&#xff1a;笛卡尔积现象。 笛卡尔积现象&#xff1a; 当两张表进行连接查询的时候&#xff0c;没有任何条件进行限制&#xff0c;最终的查询结果条数是两张表记录条数的乘积。 select ename,dname from emp,dept; 避免…

算法系列--动态规划--特殊的状态表示--分析重复子问题

&#x1f495;"轻舟已过万重山!"&#x1f495; 作者&#xff1a;Lvzi 文章主要内容&#xff1a;算法系列–算法系列–动态规划–特殊的状态表示–分析重复子问题 大家好,今天为大家带来的是算法系列--动态规划--特殊的状态表示--分析重复子问题 一.组合总数IV 链接…

实现富文本的三部曲

1、引入 ueditor.config.js ueditor.all.min.js lang/zh-cn/zh-cn.js 2、编辑器显示处 id"content" <textarea id"content" name"content"></textarea> 3、底部 <script type"text/javascript"> //实例化编辑器 …

搜索与图论——Floyd算法求最短路

floyd算法用来求多源汇最短路 用邻接矩阵来存所有的边 时间复杂度O(n^3) #include<iostream> #include<cstring> #include<algorithm>using namespace std;const int N 20010,INF 1e9;int n,m,k; int g[N][N];void floyd(){for(int k 1;k < n;k ){f…

网络基础(二)——序列化与反序列化

目录 1、应用层 2、再谈“协议” 3、网络版计算器 Socket.hpp TcpServer.hpp ServerCal.hpp ServerCal.cc Protocol.hpp ClientCal.cc Log.hpp Makefile 1、应用层 我们程序员写的一个个解决我们实际问题&#xff0c;满足我们日常需求的网络程序&#xff0c;都是在…

QT+Opencv+yolov5实现监测

功能说明&#xff1a;使用QTOpencvyolov5实现监测 仓库链接&#xff1a;https://gitee.com/wangyoujie11/qt_yolov5.git git本仓库到本地 一、环境配置 1.opencv配置 将OpenCV-MinGW-Build-OpenCV-4.5.2-x64文件夹放在自己的一个目录下&#xff0c;如我的路径&#xff1a; …

appium辅助自动化工具-- Appium studio

这里我要给大家介绍一款appium辅助自动化测试工具appium studio&#xff0c;你没看错&#xff0c;不是android studio&#xff0c;也不是appium android studio&#xff0c;就是appium studio&#xff01; 下载地址&#xff1a; Appium Studio | Digital.ai Continuous Test…

智慧公厕的技术融合策略

智慧公厕是迎合现代城市发展需要的一项重要基础设施&#xff0c;其设计的技术融合策略在实现公共厕所泛在感知、互通互联、协同构筑智慧城市等方面起到了关键作用。本文将以智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案例现场实景实图实例&#xff0c;从物…

Makefile:动态库的编译链接与使用(六)

1、动态链接库 动态链接库&#xff1a;不会把代码编译到二进制文件中&#xff0c;而是运行时才去加载&#xff0c;所以只需要维护一个地址 动态&#xff1a;运行时才去加载&#xff0c;即所谓的动态加载连接&#xff1a;指库文件和二进制程序分离&#xff0c;用某种特殊的手段…

MySQL - 高阶语句(一)

先准备一张表 create table class1 (id int,name varchar(10) primary key not null ,score decimal(5,2),address varchar(20),hobbid int(5));insert into class1 values(1,liuyi,80,beijing,2); insert into class1 values(2,wangwu,90,shengzheng,2); insert into class1 …

图腾柱PFC:HP1010为您的电动两轮车之旅提供绿色,高效,安全的动力

电动两轮车不仅为当今生活提供了便利&#xff0c;更是一种健康和绿色的出行方式。想象一下&#xff0c;在经过一整晚的充分休息&#xff0c;骑上爱车&#xff0c;满血复活的准备开始新的一天。您会愿意带着如何给心爱的两轮车充电的担心开始这一天吗&#xff1f; 随着越来越…

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…

JUC并发编程(七)

1、不可变对象 1.1、概念 不可变类是指一旦创建对象实例后&#xff0c;就不能修改该实例的状态。这意味着不可变类的对象是不可修改的&#xff0c;其内部状态在对象创建后不能被更改。不可变类通常具有以下特征&#xff1a; 实例状态不可改变&#xff1a;一旦不可变类的对象被…

中药知识分享

中药知识分享 声明&#xff1a;本文根据《懒兔子》公众号公益视频整理&#xff0c;参考网络信息略有改动&#xff0c;图片来源于网络&#xff0c;如有侵权&#xff0c;请联系删除。文章内容如有不正确之处请指正批评。仅供学习使用。请勿擅自服用本文提及的药材&#xff0c;否…

http响应练习—在服务器端渲染html(SSR)

一、什么是服务器端渲染&#xff08;SSR&#xff09; 简单说&#xff0c;就是在服务器上把网页生成好&#xff0c;整个的HTML页面生成出来&#xff0c;生成出的页面已经包含了所有必要的数据和结构信息&#xff0c;然后直接发给浏览器进行展现。 二、例题 要求搭建http服务&a…

pymysql使用记录

最近由于需要来学习一下pymysql。 先来认识一下pymysql&#xff1a; PyMySQL 是 Python 中一个用于连接 MySQL 数据库的库。它允许 Python 程序通过简单的 API 调用来连接、操作和管理 MySQL 数据库。PyMySQL 是在 Python 中使用纯 Python 编写的&#xff0c;因此它可以在几…

2024/3/31周报

文章目录 摘要Abstract文献阅读题目创新点实验数据研究区域数据和材料 方法XGBoost algorithmLong Short‑Term Memory AlgorithmEvaluation of the Model Accuracy 实验结果 深度学习XGBoost代码实现AdaBoostBoostingAdaBoost算法AdaBoost代码实现 总结 摘要 本周阅读了一篇基…

Mamba: Linear-Time Sequence Modeling with Selective State Spaces(论文笔记)

What can I say? 2024年我还能说什么&#xff1f; Mamba out! 曼巴出来了&#xff01; 原文链接&#xff1a; [2312.00752] Mamba: Linear-Time Sequence Modeling with Selective State Spaces (arxiv.org) 原文笔记&#xff1a; What&#xff1a; Mamba: Linear-Time …

NFC RC522开发记录

文章目录 一、ID卡、IC卡(M1卡、CPU卡)的区别二、RC522读写操作1. 数据读写流程三、RC522驱动代码1. RC522 与 STM32 的接线图2. RC522.c3. RC522.h4. main.c一、ID卡、IC卡(M1卡、CPU卡)的区别 ID卡 :只存储了ID号,设备识别ID号,没有算法可言,容易复制,安全性低IC卡包含了…

Unity-C#进阶——3.27更新中

文章目录 数据结构类ArrayListStackQueueHashtable 泛型泛型类、泛型方法、泛型接口ListDictionaryLinkedList泛型栈&#xff0c;泛型队列 委托和事件委托事件匿名函数Lambad 表达式**闭包** List 排序逆变协变多线程进程线程多线程方法&#xff1a;线程之间共享数据&#xff1…