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

news2024/11/26 2:35:15

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

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

目录

计数排序

步骤:

基数排序

具体步骤如下

桶排序

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


计数排序

步骤:

  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.coloradmin.cn/o/1558961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

透视未来安全:PIR技术引领数据隐私新时代

1.隐语实现PIR总体介绍 隐语实现的Private Information Retrieval (PIR) 是一种隐私增强技术&#xff0c;它使用户能够在不暴露他们实际查询内容的情况下从远程服务器数据库中检索所需信息。以下是隐语在实现PIR方面的概要说明和技术特点&#xff1a; 基本概念&#xff1a; PI…

移动硬盘无法读取打不开?原因分析与解决方案

一、移动硬盘遭遇困境&#xff1a;无法读取打不开 在数字信息爆炸的时代&#xff0c;移动硬盘成为了我们储存和传输数据的重要工具。然而&#xff0c;当移动硬盘突然无法读取打不开时&#xff0c;我们往往会感到手足无措。插入电脑后&#xff0c;移动硬盘的指示灯可能正常闪烁…

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

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

dubbo下

dubbo 集成springboot 配置文件 controller 启动类 注册中心宕机 负载均衡 zookeeper注册中心 dubbo原理 dubbo架构 各层说明 增强spi原理

Native Instruments Kontakt 7 for Mac v7.9.0 专业音频采样

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

2-Prometheus监控主机

1 介绍 Prometheus 使用 node_exporter 服务程序监控 Linux 主机。 2 部署 2.1 下载 官方下载地址 https://prometheus.io/download/ 找到 node-export 下载即可 curl -o node-exporter.tar.gz -L https://github.com/prometheus/node_exporter/releases/download/v1.7.0/…

Linux非root用户安装mysql5.7

1、下载安装包MySQL :: Download MySQL Community Server 点击Archives 我下载的是5.7.27版本&#xff0c;linux主机直接选择linux-Generic即可&#xff0c;选择第一个包下载即可 2、安装mysql 解压 shell> tar xzvf mysql-5.7.31-linux-glibc2.12-x86_64.tar.gz shell&g…

idea中Git项目遇到“Filename too long”错误 与 配置Git的ssh证书

一&#xff1a;“Filename too long”问题解决办法 错误信息&#xff1a; fatal: cannot create directory at xxxx: Filename too long warning: Clone succeeded, but checkout failed. You can inspect what was checked out with git status and retry with git restore …

【Visual Studio】将项目下的文件夹所有文件随编译自动复制输出到运行目录

要将项目根目录下的文件夹内容输出到运行目录&#xff0c;去处理其中的子文件夹和文件&#xff0c;逐个手动设置文件属性或进行复制显然不是一个可行的方法&#xff0c;因为这既繁琐又低效&#xff0c;那有没有更加高效的方式呢 文章目录 选择文件夹修改配置文件输出文件夹 这里…

二维码门楼牌管理应用平台建设:实现民主参与的新途径

文章目录 前言一、二维码门楼牌管理应用平台的兴起二、投票表决功能的实现三、居民参与度的提升四、面临的挑战与前景展望 前言 在数字化时代&#xff0c;二维码技术的应用已经渗透到我们生活的方方面面。近期&#xff0c;二维码门楼牌管理应用平台的建设成为了社区治理的一大…

Android设备无线连接电脑及QXDM、QACT等工具的方法

首先样机和笔记本电脑连接同一wifi网络 adb root adb shell ifconfig复制inet addr地址 ping inet addr地址 adb tcpip 5555 adb connect (inet addr地址):5555 此时adb和机器使用wifi连接好了&#xff0c;可以拔出usb线 ipconfig查询电脑的IP地址 ipconfig使用adb在主机上…

Qt使用opencv,进行视频录制,功能打开、关闭摄像头,开始、结束录制视频,暂停、继续录制,并保存视频文件

1.效果图 2 代码实现 2.1 .h文件 #ifndef VIDEORECORDWIDGET_H #define VIDEORECORDWIDGET_H#include <QWidget>#include<QFileDialog>#include <QImage> #include <QLabel> #include <QTimer> #include <opencv2/opencv.hpp>using name…

pytest--python的一种测试框架--fixture/YAML/parametrize

一、pytest的fixture详解 fixture概念fixture是pytest用于将测试前后进行预备、清理工作的代码处理机制。 fixture相对于setup和steardown来说有以下几个优势&#xff1a; 1.fixure命名更加灵活&#xff0c;局限性比较小。 2.conftest.py配置里面可以实现数据共享&#xff0…

数据可视化-Python

师从黑马程序员 Json的应用 Json的概念 Json的作用 Json格式数据转化 Python数据和Json数据的相互转化 注&#xff1a;把字典列表变为字符串用dumps,把字符串还原回字典或列表用loads import json#准备列表&#xff0c;列表内每一个元素都是字典&#xff0c;将其转化为Json …

【Clang+LLVM+honggfuzz学习】(一)LLVM简介、安装和第一个Hello Pass

本文结构&#xff0c;PS:根据需要选择观看哦 1. 前言参考 2.简介传统编译器架构LLVM架构 3. LLVM安装版本准备官网源码下载git下载安装过程 4. 写一个LLVM Pass旧Hello Pass实现&#xff08;legacy PM version&#xff09;新Hello Pass实现&#xff08;Using the New Pass Mana…

第六十三回 呼延灼月夜赚关胜 宋公明雪天擒索超-大模型BERT、ERNIE、GPT和GLM的前世今生

神行太保戴宗报信&#xff0c;关胜人马直奔梁上泊&#xff0c;请宋江早早收兵&#xff0c;解梁山之难。宋江派了花荣到飞虎峪左边埋伏&#xff0c;林冲到右边埋伏&#xff0c;再叫呼延灼带着凌振&#xff0c;在离城十里附近布置了火炮&#xff0c;然后才令大军撤退。 李成闻达…

典型周边生态系统

目录 一、概述 二、项目管理系统 2.1 项目管理系统基本工作流 2.2 常用项目管理系统介绍 2.2.1 禅道 2.2.1.1 禅道概述 2.2.1.2 禅道特点 2.2.1.2.1 部署方案 2.2.1.2.2 管理模型 2.2.1.2.3 DevOps解决方案 2.2.1.2.4 自动化测试 2.2.1.2.5 数据大屏 2.2.1.2.6 协同…

阿里云ECS u1实例性能测试,2核4G,5M固定带宽,80G ESSD Entry盘

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

MATLAB 点云随机渲染赋色(51)

MATLAB 点云随机渲染赋色(51) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 为点云中的每个点随机赋予一种颜色,步骤和效果如图: 1、读取点云 (ply格式) 2、随机为每个点的RGB颜色字段赋值 3、保存结果 (ply格式) 二、算法实现 1.代码 代码如下(示例):…

设计模式-结构型-享元模式Flyweight

享元模式的特点&#xff1a; 享元模式可以共享相同的对象&#xff0c;避免创建过多的对象实例&#xff0c;从而节省内存资源 使用场景&#xff1a; 常用于需要创建大量相似的对象的情况 享元接口类 public interface Flyweight { void operate(String extrinsicState); } 享…