计数排序和基数排序

非比较排序-----计数排序,基数排序。 排序总归来说可分为两大类,比较排序与非比较排序。比较排序就是我们常用到的冒泡排序,插入排序,希尔排序,选择排序,堆排序,快速排序,归并排序。非比较排序不常用,但是在对一些特殊的情况进行处理时,它的速度反而更快。 1、计数排序   排序原理:利用哈希的方法,将每个数据出现的次数都统计下来。哈希表是顺序的,所以我们统计完后直接遍历哈希表,将数据再重写回原数据空间就可以完成排序。 注意事项 阅读详情

计数排序

计数排序是一种非比较性排序,时间复杂度为O(n + k),主要适用于排序的数组极大值和极小值直接的差不大的情况,如果待排序数组极值差过大,则会造成过多的空间浪费,具体原理如图所示:

 

  1. 原理 

  2. 实现

    public void countSort(int[] arr) {
            int min = arr[0], max = arr[0];//获得数组的极值,确定数组长度
            for (int i = 1; i < arr.length; i++) {
                if (min > arr[i])
                    min = arr[i];
                if (max < arr[i])
                    max = arr[i];
            }
    
            int[] countArr = new int[max - min + 1];
            for (int anArr : arr) countArr[anArr - min]++;//将数据分散到指定的计数桶中
    
            int index = 0;//将技术桶中的数据导入到数组中
            for (int i = 0; i < countArr.length; i++) {
                int count = 0;
                while (count < countArr[i]) {
                    arr[index] = min + i;
                    index++;
                    count++;
                }
            }
        }

     

基数排序

基数排序也是一种非比较性排序, 时间复杂度O(K * n),试用场景于计数排序基本一致但是对于空间资源的利用大大提高,基本思路是分别对待排序值的每一位进行排序,比如[15,21,34] 我们首先对个位进行排序,个位排序结果是[21,34,15],之后对十位进行排序得到[15,21,34],由于排序数组最高位就是十位,则完成排序得到最终结果[15,21,34],具体原理如图所示:

  1. 原理

  2. 实现

    public void radixSort(int[] arr) {
            Point[] barrel = new Point[10];
            int length = getMaxValueLength(arr); //获取循环次数
    
            for (int m = 0; m < length; m++) {
                for (int i = 0; i < arr.length; i++) {     //对数组里每一个数据进行分桶操作
                    int index = (int) ((arr[i] / (Math.pow(10, m))) % 10);
                    Point p = barrel[index];
                    if (p == null)
                        barrel[index] = new Point(arr[i], null);
                    else {
                        p.next = new Point(arr[i], p.header);
                        barrel[index] = p.next;
                    }
                }
    
                int i = 0;
                for (Point point : barrel) {  //将本次分桶的结果,保存的数组中
                    if(point == null) continue;
                    point = point.header;
                    arr[i] = point.val;
                    i++;
                    while((point = point.next) != null) {
                        arr[i] = point.val;
                        i++;
                    }
                }
    
                for (int i1 = 0; i1 < barrel.length; i1++) barrel[i1] = null;
            }
        }
    
        class Point {
            int val;
            Point next;
            Point header;
    
            Point(int val, Point header) {
                this.val = val;
                if(header == null){
                    this.header = this;
                } else {
                    this.header = header;
                }
            }
    
            @Override
            public String toString() {
                return "Point{" +
                        "val=" + val +
                        ", next=" + next +
                        '}';
            }
        }
        //获取数组中最大的位数
        private int getMaxValueLength(int[] arr) {
            int max = arr[0];
            for (int i : arr)
                if (i > max) max = i;
    
            int length = 1;
            while ((max /= 10) > 0) length++;
    
            return length;
        }

     

【数据结构与算法】(17):详解“计数排序”和“基数排序” 彻底学会“计数排序“和基数排序,两者并不是一回事 阅读详情

相关推荐

桶排序、计数排序和基数排序比较分析

一、桶排序 1. 算法思想:桶排序是将待排序序列中处于相同值域的元素存入同一个桶中,即将一个数据表分割成许多桶,然后每个桶中的元素各自排序。它采用分治策略,是一种分布式的排序方法。 2. 算法过程: (1)根据待排序序列中最大元素和最小元素的差值和映射规则,确定申请的桶个数; (2)遍历待排序序列,将每一个元素存储到对应的桶中; (3)分别对每一个桶中元素进行排序,并存储到原序列中,获得...

QiaoRuoZhuo的专栏 563

排序算法:基数排序与计数排序

基数排序是基于计数排序的算法,每次都需要使用计数排序从而实现基数排序。 那么什么叫基于计数排序?我们首先要明白基数排序的原理: 每次对数字的一个数位(个位、十位、百位......)进行比较,每次比较后进行一个排序,注意,我们需要保证每次排序后元素的前后位置不变(这点非常关键),为什么说这点非常关键?因为只有第一次排序后相对位置没有变化,才能保证后面比较十位的数(百位等)时,顺序是正确的。那么其实我们的难点也就在于怎么保证比较前后元素的相对位置没有改变。相信很多小火罐们看这篇文章就是为找到...

awaitxm的博客 3740

【ros2】ros2_control 全面解析与实战指南

ros2_control 是 ROS2 生态中用于机器人实时控制的核心框架,旨在统一硬件接入接口、复用控制算法,避免重复开发,实现仿真与实机硬件的无缝迁移。其核心目标是简化不同硬件(传感器、执行器、完整系统)的集成流程,让开发者专注于控制逻辑而非硬件适配。创建类型功能包,依赖rclcpp。实现on_initupdate在中声明控制器插件,编译生成动态库。在 YAML 配置文件中指定自定义控制器类型,加载测试。

EnHengNa的博客 1475

[算法]计数排序和基数排序

目录 一、计数排序 1、计数排序的过程 2、计数排序的局限性 3、计数排序代码 二、基数排序 1、基数排序思想 2、例子 3、解决对齐问题 4、基数排序代码 三、两者的时间复杂度和空间复杂度

weixin_45922730的博客 1356

推荐系统在音乐领域的实践:网易云音乐推荐算法解析

你是否有过这样的经历?打开网易云音乐,“私人FM”里总能推到你想听的歌;“每日推荐”的歌单,往往藏着你没听过但一入耳就爱上的曲目。这些“懂你”的推荐背后,是一套复杂却精密的推荐系统在运转。问题陈述:音乐推荐的难点远超一般商品——音乐是高度主观的艺术,用户兴趣易随心情、场景变化;小众音乐的“长尾效应”显著,如何让冷门好歌被发现?传统协同过滤依赖历史行为,面对新用户/新歌曲的“冷启动”问题束手无策;而单纯的内容推荐又难以捕捉用户的隐性兴趣。核心方案:网易云音乐采用“混合推荐策略”——融合协同过滤(CF)

AI天才研究院 2086

【驭风计划 机器学习】实验6 基于集成学习的 Amazon 用户评论质量预测

¶随着电商平台的兴起,以及疫情的持续影响,线上购物在我们的日常生活中扮演着越来越重要的角色。在进行线上商品挑选时,评论往往是我们十分关注的一个方面。然而目前电商网站的评论质量参差不齐,甚至有水军刷好评或者恶意差评的情况出现,严重影响了顾客的购物体验。因此,对于评论质量的预测成为电商平台越来越关注的话题,如果能自动对评论质量进行评估,就能根据预测结果避免展现低质量的评论。本案例中我们将基于集成学习的方法对 Amazon 现实场景中的评论质量进行预测。

Mege1的博客 471

基数排序、桶排序和计数排序的区别

1.桶排序(Bucket Sort) 基本思路是: 将待排序元素划分到不同的痛。先扫描一遍序列求出最大值 maxV 和最小值 minV , 设桶的个数为 k ,则把区间 [minV, maxV] 均匀划分成 k 个区间,每个区间就是一个桶。将序列中的元素分配到各自的桶。 对每个桶内的元素进行排序。可以选择任意一种排序算法。 将各个桶中的元素合并成一个大的有序序列。 假设数据是均匀分布的,则每个桶...

Lin 的博客 1万+

Proteus仿真AT89C51驱动DHT11:温湿度数据采集与LCD1602显示的5个调试坑点总结

本文总结了在Proteus仿真环境下使用AT89C51驱动DHT11温湿度传感器并通过LCD1602显示的5个常见调试坑点,包括DHT11时序问题、LCD1602初始化错误、数据校验失败、仿真特有差异及系统稳定性问题,提供了详细的解决方案和优化代码示例,帮助开发者高效完成温湿度采集项目。

weixin_30335575的博客 355

27.【必备】计数排序和基数排序

本文的网课内容学习自B站左程云老师的算法详解课程,旨在对其中的知识进行整理和分享~

XY_StarField的博客 1225

第七天 Labview进阶(7.2 与汇川PLC通信)

运行环境: Labview 2020 Autoshop v4.10.1.1 该文档中包括Labview程序和汇川PLC程序,可以完美实现Labview与汇川PLC的通信。具体的使用教程可以参考本人的相关文章,讲解详尽,请尽情享用!

weixin_38637405的博客 3527

python ERA-5气象数据NetCDF格式解析(一)

python ERA-5气象数据NetCDF格式解析

weixin_43896283的博客 2638

基数排序和计数排序

首先,基数排序 基数排序,算法的复杂度大概是时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数 以下为摘抄 第一步 以LSD为例,假设原来有一串数值如下所示: 73, 22, 93, 43, 55, 14, 28, 65, 39, 81 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中: 0 1 81 2 22 3 73 93 43 4 1

644

CUDA内核反汇编实战:用cuobjdump解锁SASS指令的奥秘

本文详细介绍了CUDA内核与SASS指令的关系,以及使用cuobjdump工具进行反汇编分析的方法。主要内容包括:1. CUDA内核的基本概念及其在GPU并行计算中的重要性;2. SASS指令作为底层汇编指令的关键作用;3. cuobjdump工具的安装配置和使用方法;4. 通过数组加法实例演示反汇编过程;5. 深入分析SASS指令格式、分类和执行流程;6. 两个实际案例展示性能优化和问题排查的应用。文章为开发者提供了深入理解CUDA程序底层执行机制的有效途径。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 438

计数排序、基数排序和桶排序

计数排序、基数排序和桶排序 计数排序 不同于基于比较和交换的排序,计数排序是基于统计词频的排序,计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中,这就要求了待排元素必须是有确定范围的整数。 计数排序的过程如下???? 计数排序步骤: 确定数组元素的范围,即为 最大值和最小值 开辟对应范围长度的数组 countArr[],遍历统计待排元素设为 num 对于每次出现的 num,将 countArr[num]++ 此时按序按次输出 countArr[],即排好序 桶排序 桶排序如其名

XiDieccc的博客 904

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践

本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 215

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++实现排序 - 03 计数排序、桶排序和基数排序

数据结构与算法专栏 —— C++实现计数排序是去统计每个值在数组中的数量,然后依次放在它们应该在的位置,所以这个算法不适合数组中的值过大,因为这是用空间来换时间。并且,计数排序也不适合按照字符串进行排序。算法步骤如下:直接上图:我们对数组先进行遍历,统计每个数值的个数。统计完数量后,计算前缀和:然后对每个元素的位置进行推断,可能会有小伙伴比较疑惑为什么要弄的这么麻烦,直接从前往后根据下标输出不就好了吗。这是因为每个元素都是一个个体,如果遇到相同元素为了保证稳定性,即排序后相同元素前后次序和原数组中的前后顺序

Newin2020的博客 1488

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

算法——计数排序,桶排序和基数排序

由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。桶排序最好情况下使用线性时间O(n),桶排序的时间复杂度,取决与对各个桶之间数据进行排序的时间复杂度,因为其它部分的时间复杂度都为O(n)。很显然,桶划分的越小,各个桶之间的数据越少,排序所用的时间也会越少。也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;是计数排序的升级版。

2401_87463988的博客 566

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

排序【5】基数排序和计数排序

前面介绍的几种排序方式都是比较式的排序,今天,我们来介绍两种非比较排序。计数排序和基数排序。 一、计数排序 1.基本思想: 遍历待排数组,找到数组中最大的元素,然后开辟一个比这个最大元素大1的新数组,以新数组的下标表示待排元素,统计原数组中所有元素出现的个数放在新数组相应的位置,然后把新数组中除过0次出现的其余元素,按顺序拷贝回原数组即可。 2.思想流图:

ChenYang1998的博客 393

java 基数排序_计数排序、基数排序和桶排序

到目前为止,我们已经介绍了插入排序、归并排序、堆排序和快速排序这四种排序算法,这些算法有一个共同的性质,在排序的最终结果中,各元素的次序依赖于它们之间的比较。我们把这类排序算法称为比较排序。可以证明,任何比较排序算法在最坏情况下的时间复杂度都不低于 。要想突破这一限制,就需要额外的排序手段。本文探究比较排序以外的排序算法,这些算法可以摆脱 的限制,达到线性时间复杂度 。计数排序计数排序假设 ...

weixin_30662937的博客 86

由Maximum Gap,谈桶排序,基数排序和计数排序

排序算法

无自制,不成功 1618

算法学习-计数排序和基数排序

计数排序,基数排序-C++语言实现

qq_43054786的博客 938
上一篇: SpringBoot RestTemplate打印http请求响应
下一篇: CenterOS 7.4 离线安装Docker 18.03.1
hellopeng1
博客等级 码龄10年 66粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值