基数排序

C语言——排序(插入、交换、选择、归并、基数排序) 前言 《数据结构最后一弹》——排序 看完本篇,你将了解: ①查找问题概述,二者的联系 ②插入排序(直接插入排序、折半插入排序、2–路插入排序、表插入排序、希尔排序) ③交换排序(冒泡排序、快速排序) ④选择排序(简单选择排序、堆排序) ⑤归并排序 ⑥基数排序(多关键字排序介绍) 一、查找问题概述 1.基本概念 (1)“排序”是基于数据逻辑结构T=(D,R)定义的一种重要的运算。 (2)功能是将一个数据元素的任意序列,依据关键字的大小,重新排列成一个有序的序列。 (3)D是数据元素集; R是数据元素之间关系 阅读详情

1.基数排序介绍

(1)基数排序属于”分配式排序“,又称”桶子法“,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些”桶“中,达到排序的作用。
(2)基数排序属于稳定排性的排序,基数排序法是效率高的稳定性排序法。
(3)基数排序是桶排序的扩展,速度很快。
(4)基数排序是金典的以空间换时间的方式,占用内存很大,对海量数据排序时,容易造成OOM。
(5)有负数的数组,不适合用基数排序。
(6)基数排序是1887年赫尔曼.何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。
(7)基数排序将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。

2.示意图

在这里插入图片描述在这里插入图片描述

3.代码实现

@Test
public void testSort(){
    //我们来测一下各种排序速度
    int[] array = new int[100000];
    for (int i = 0; i < array.length; i++) {
        array[i] = (int) (Math.random()*100000);
    }
    long start = System.currentTimeMillis();
    //bubbleSorting(array);//冒泡排序排序100000个数总耗时17984毫秒
    //selectSorting(array);//选择排序排序100000个数总耗时3203毫秒
    //insertSorting(array);//直接插入排序100000个数总耗时1109毫秒
    //shellSortByExchange(array);//希尔的交换排序100000个数总耗时7829毫秒
    //shellSortByMove(array);//希尔的移动排序100000个数总耗时16毫秒
    //quickSort(array,0,array.length-1);//快速排序的移动排序100000个数总耗时31毫秒
    //mergeSort(array,0,array.length-1,new int[array.length]);//归并排序的移动排序100000个数总耗时16毫秒
    cardinalitySort(array);//基数排序的移动排序100000个数总耗时31毫秒
    long end = System.currentTimeMillis();
    System.out.println("总共耗时:"+(end-start));
}
public void cardinalitySort(int[] array) {
    //得到数组中最大数的位数,从而得到循环的次数
    int max = array[0];
    for (int i = 1; i < array.length; i++) {
        if (max < array[i]) {
            max = array[i];
        }
    }
    int digit = (max+"").length();
    /*
     * 定义一个二位数组,二位数组包含10个一维数组
     * 对应着0-9这10个桶,而每个桶的最大容量就是array.length
     */
    int[][] bucket = new int[10][array.length];
    //还需一个一维数组来记录每个桶中实际放入数据的个数
    int[] buckerElementCounter = new int[10];
    //n=1表示先取个位
    for (int i = 0, n = 1; i < digit; i++, n*=10) {
        for (int j = 0; j < array.length; j++) {
            //取出每个元素相应位数上对应的值
            int element = array[j]/n%10;
            //放入对应的桶中
            bucket[element][buckerElementCounter[element]] = array[j];
            //桶中的元素加一
            buckerElementCounter[element]++;
        }
        int index = 0;
        //按照桶中元素的顺序,把这些元素放入原数组中
        for (int k = 0; k < buckerElementCounter.length; k++) {
            //先要判断桶中有没有数据
            if (buckerElementCounter[k] != 0) {
                for (int j = 0; j < buckerElementCounter[k]; j++) {
                    array[index++] = bucket[k][j];
                }
            }
            //处理完每个桶后,要把桶中的元素个数置为0
            buckerElementCounter[k] = 0;
        }
    }
}
【基数排序】十大排序算法之基数排序 【基数排序】十大排序算法之基数排序,是属于【稳定】的排序。 阅读详情

相关推荐

反无人机技术实战解析:从探测到拦截的全方位防御策略

本文深入解析了反无人机(C-UAS)技术的全链条防御策略。从雷达、无线电频谱、光电等多维度探测技术,到数据融合与威胁评估,再到无线电干扰、导航诱骗及物理拦截等核心拦截手段,系统阐述了如何构建从探测到拦截的实战化防御体系,为关键设施、大型活动等场景提供定制化空域安全解决方案。

weixin_29230649的博客 403

排序算法总结

转载于 http://www.cnblogs.com/vinozly/p/5606132.html 各种排序算法的稳定性和时间复杂度小结 选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法, 冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。   冒泡法:  这是最原始,也是众所周知的最慢的算法了。他的名字的由来

Yates Law的博客 491

Multisim 14.0实战:从零搭建可调幅多波形信号发生器(附仿真文件)

本文详细介绍了如何在Multisim 14.0中从零搭建一个可调幅多波形信号发生器,涵盖方波、三角波和正弦波的生成原理与实现步骤。通过核心电路架构解析、关键参数设计及Multisim实战操作,帮助电子工程学习者和硬件工程师掌握信号发生器的设计与调试技巧,并提供仿真文件供实践验证。

nokia的博客 1073

八大排序算法总结

算法一:冒泡排序 每次比较相邻两元素,若错序则交换,多次遍历,直至无交换,实质上需要排序k-1趟,每次找到未排序元素中的最大值放在已排序序列最后面,稳定。 void bubble_sort(int array[], int n) { int i, j; for (i = 0; i &lt; n - 1; i++) //排序n-1趟,每次寻找未排序序列中的最大值 { ...

qy724728631的博客 388

python数据处理与分析案例,python如何进行数据处理

大家好,本文将围绕基于python的数据处理案例展开说明,python数据处理与分析案例是一个很多人都想弄明白的事情,想搞清楚python如何进行数据处理需要先了解以下几个事情。大家好,小编来为大家解答以下问题,python数据处理案例步骤及其代码,python数据处理与分析教程,今天让我们一起来看看吧!哈喽~今天学习记录的是数据分析实训小案例。就用这个案例来好好巩固一下 python 数据分析三剑客。

a17348的博客 1240

python提取图片中的文字写入excel文件,并打包为exe可执行文件

python提取图片中的文字写入excel文件,并打包为exe可执行文件

liqiang12689的博客 989

深入学习排序算法之稳定性、比较次数、交换次数探讨

在学习排序算法时,出于效率考虑,经常容易看到算法的稳定性、比较次数及交换次数研究。特别是考试或者公司笔试题,经常出现这样的题目。由于排序算法有很多种,平时提出大家才能说出个大概,但真要考查这些细节,估计很多人都说不准确。博主下决心写此文章,彻底探查清楚这些问题,与大家共享之。         首先说明稳定性是指相同元素在排序后相对位置保持不变。个人感觉稳定性的含义在于更广泛情形下,排序元素通常具

dreamer2020的专栏 2万+

5分钟搞定!用扣子空间LinkReaderPlugin快速搭建网页内容抓取机器人(附Python复现代码)

本文详细介绍了如何利用扣子空间的LinkReaderPlugin快速搭建网页内容抓取机器人,仅需5分钟即可完成配置。通过Python复现代码和可视化工作流,开发者可以轻松实现智能网页抓取,提升数据采集效率。文章还探讨了与RAG工作流的集成方案及性能优化技巧,适用于金融监控、电商追踪等多种场景。

study的专栏 1093

什么是基数排序?

文章目录什么是基数排序稳定的计数排序基数排序的实现 什么是基数排序 稳定的计数排序 数据结构与算法 | 计数排序 计数排序的基本思路在这里就不多进行介绍了,如果不了解的可以看看我以前写的博客。 void countSort(vector<int>& arr) { int max = arr[0], min = arr[0]; //找出最大值和最小值,缩减范围 for(int i = 1; i < arr.size(); i++) {

凌桓丶的博客 1万+

第18章:Ingestion Pipeline 数据摄取流水线

本文介绍了LlamaIndex的IngestionPipeline如何解决合同文档处理中的四大核心问题:不可重复、无追溯、无容错和无法缓存。通过标准化数据处理流程,将手工操作升级为工厂流水线模式,实现数据的可复用、可追踪和高效处理。文章详细阐述了Pipeline的设计原理,包括Transformation的串行编排、缓存机制(基于输入和Transformation的哈希值)以及数据血缘追踪(通过Node的metadata记录处理过程)。

davidwang456的专栏 63

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1845

基数排序与链式基数排序

折腾数据结构实验的时候遇到这一个算法。之前对此不甚了解,总算也找到一篇不错的文章。转载如下   基数排序 (Radix Sort) 基数排序是采用“分配”与“收集”的办法,用对多关键码进行排序的思想实现对单关键码进行排序的方法。 多关键码排序: 1.以扑克牌排序为例。每张扑克牌有两个“关键码”:花色和面值。其有序关系为: 花色: 面值:2 2.如果我们把所有扑克牌排成以下

atskyline 1万+

05 - matlab m_map地学绘图工具基础函数 - 设置比例尺指北针

本篇介绍下m_map中添加指北针(m_northarrow)、比例尺(m_ruler)和进行比例缩放(m_scale)的函数及其用法 。提供了 示例以便参考,罗列了 各函数可设属性。希望对绘图的你有所帮助。

weixin_43339605的博客 1947

基数排序--链式基数排序(Radix)

链式基数排序:属于”分配式排序”(distribution sort)基数排序法又称“桶子法”(bucket sort)或bin sort。 链式基数排序思想:透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数。 时间效率:设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O

保福寺计算机 的专栏 2579

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基数排序——详解

基数排序(英语:Radix sort)是一种非比较型的排序算法,最早用于解决卡片排序的问题。基数排序将待排序的元素拆分为个关键字,逐一对各个关键字排序后完成对所有元素的排序。如果是从第关键字到第关键字顺序进行比较,则该基数排序称为 MSD(Most Significant Digit first)基数排序;如果是从第关键字到第关键字顺序进行比较,则该基数排序称为 LSD(Least Significant Digit first)基数排序。

w_w_wwwww的博客 1241

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

基数排序算法

文章目录一、基数排序概述二、基数排序的步骤三、基数排序的代码实现 一、基数排序概述 基数排序(radix sort)属于 “分配式排序”(distribution sort),又称 “桶子法”(bucket sort)。基数排序的基本思想是:通过待排序元素的各个位的值,将待排序元素分配至某些 “桶” 中,达到排序的效果。 基数排序是桶排序的扩展,基数排序法是效率高的稳定性排序法。 二、基数排序的步骤 基数排序过程一般遵循下面的基本步骤: 首先确定待排序序列 arr 中最大的元素,得出元素的位数 N,位

Ronz 的博客 2703

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

基数排序详解

基本概念: 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。 它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到

daiyudong2020的博客 5221

C++ 基数排序

基数排序的原理: (1)首先,把整数通过求余的方式拆分成“个位、十位、百位、… ”; (2)然后,统计每个整数的“个位、十位、百位、… ”出现的次数,之后把次数存到以“余数”为编号的桶子里; (3)最后,通过一个整数出现的次数-1,从而算出正确顺序的位置,再把整数放进去,就有顺序了。 #include &lt;iostream&gt; #include &lt;stdlib.h&gt; ...

辛旭东小小工作室 824

【算法】基数排序

计数排序 学习基数排序之前首先学习计数排序。 计数排序假设每个元素都是在0到k之间的一个整数。 基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。 计数排序的算法用伪代码描述为: COUNTING-SORT(A,k) // 初始化数组C

weiersyuan的专栏 4416
上一篇: 归并排序
下一篇: 查找算法
killerofjava
博客等级 码龄7年 10粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值