0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基数排序是怎么排的_基数排序详细过程

lhl545545 来源:电子发烧友网 2018-02-05 14:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

计数排序

学习基数排序之前首先学习计数排序。

计数排序假设每个元素都是在0到k之间的一个整数。

基数排序的基本思想,对于每个元素x,如果我们知道了小于x的元素的个数,就可以确定输出数组中元素x的位置,那么直接将元素x放到输出数组中。比如有3小于x的元素,那在输出数组中,x肯定位于第4个位置。

计数排序的算法用伪代码描述为:

COUNTING-SORT(A,k)

// 初始化数组C

for i=0 to k

C[i]=0

// 统计A[j]元素出现的次数,保存到C数组中

for j=0 to A.length

C[A[j]]=C[A[j]]+1

// 统计小于等于A[j]元素的个数

for k=0 to k

C[K]=C[K-1]+C[K]

// 将A中的元素放在B中正确的位置

for i=A.length to 0

B[C[A[i]]-1]=A[i]

C[A[i]]=C[A[i]]-1

注:由于有可能有相同元素存在,所以,每次将A[i]元素放入B数组中,都要将C[A[j]]的值减一,这样当遇到下一个值等于A[j]的元素时,该元素就能放在输出数组中A[j]的前面。

计数排序的详细过程如下

基数排序是怎么排的_基数排序详细过程

计数排序的关键代码如下

public int[] countSort(int a[], int k) {

int[] b = new int[a.length];

int[] c = new int[k];

for (int i = 0; i

c[i] = 0;

}

for (int i = 0; i

c[a[i]] += 1;

}

for (int i = 0; i

if (i != 0) {

c[i] += c[i - 1];

}

}

for (int i = a.length - 1; i >= 0; i--) {

b[c[a[i]] - 1] = a[i];

c[a[i]] = c[a[i]] - 1;

}

return b;

}

计数排序的性能

很容易得到计数排序的时间复杂度为:T(n)=O(k+n),因此当k小于等于n,也就是当k=O(n),k和n同阶时,采用计数排序的时间复杂度为T(n)=O(n)

同时,计数排序也是一种稳定的排序算法。

基数排序

基数排序最初是用在打孔卡片制表机上的一种排序算法,由Herman Hollerith发明,也就是IBM的创始人。

基数排序从最低为开始来排序的,从低位到高位,按位排序,按位排序必须是稳定的。

基数排序的详细过程

基数排序是怎么排的_基数排序详细过程

基数排序算法描述

RADIX-SORT(A,d)

for i=1 to d

use a stable sort to sort arrat A on digit i

在这里我们选择计数排序。考虑常规情况,对[0.。.9]之间的数排序,k=10,且一般有k<

基数排序的关键代码,这里以数组排序时按照十进制每位进行比较。

/**

* 基数排序

* @param result 最终已排序的数组,共用一个节省空间

* @param maxLen 待排序的数组中最大的位数

*/

public static void radixSort(int[] a,int[] result, int maxLen) {

int flag = 1;

// 保存每轮要排序的位对应数组a的值

int [] digitArr = new int[a.length];

for(int i=0; i

// 共比较的轮数

flag *= 10;

// b数组中对应的装着a数组中每位的数,第一轮装着各位,第二轮装着十位数。。.

for (int j = 0; j < digitArr.length; j++) {

digitArr[j]=a[j]%flag;

digitArr[j]=digitArr[j]/(flag/10);

}

countSort(a, digitArr,result,10);

// 每一轮计数排序完后刷新下一轮要排序的数组

System.arraycopy(result, 0, a, 0,result.length);

}

}

调用计数排序的函数

/**

* 计数排序 :对数组a中的元素按某些位排序

* @param tmp 要参与排序的当前位的值保存在tmp中

* @param result 每次计数排序后的新的数组顺序

*/

public static void countSort(int a[], int tmp[], int result[], int k) {

int[] c = new int[k];

for (int i = 0; i < c.length; i++) {

c[i] = 0;

}

for (int i = 0; i

c[tmp[i]] += 1;

}

for (int i = 0; i < c.length; i++) {

if (i != 0) {

c[i] += c[i - 1];

}

}

for (int i = tmp.length - 1; i >= 0; i--) {

// 和计数排序唯一的差别在于赋值的时候用真实的数据

result[c[tmp[i]] - 1] = a[i];

c[tmp[i]] = c[tmp[i]] - 1;

}

}

基数排序的性能

如果基数排序使用的稳定排序算法的时间复杂度为O(n+k),那么基数排序的时间复杂度为T(n)=O(d(n+k))

很容易理解要循环d轮,每轮耗时为O(n+k),于是总的耗时为O(d(n+k))

在此基础上,从2^r进制来看,此时k为2^r,并且一个b位数要比较b/r轮。于是我们得到T(n)=O((b/r)(n+2^r))

对上式求导可得其最小值。此时r=lgn,此时T(n)=O((b/lgn)n),如果再取b=lgn,这时就能达到最少的运行时间,时间复杂度为T(n)=O(n)

基数排序也是稳定的排序算法

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    安达发|APS自动单软件:金属加工厂的“智慧大脑”

    在金属加工车间里,我们常常看到这样的场景:计划员面对墙上密密麻麻的白板,不断擦写订单信息;生产主管在机床间奔走,协调设备与人员;销售人员不断追问:“我的订单什么时候能交付?”这种依赖人工经验的传统
    的头像 发表于 11-25 14:17 167次阅读
    安达发|APS自动<b class='flag-5'>排</b>产<b class='flag-5'>排</b>程<b class='flag-5'>排</b>单软件:金属加工厂的“智慧大脑”

    安达发|制药车间在“人脑”产?APS生产程软件才是智慧解药!

    在制药行业,制药车间就像是一座精密运行的工厂,每一个环节都关乎着药品的质量和生产效率。而APS生产程软件,正逐渐成为这座工厂里的“智慧大脑”,引领着制药生产走向新的高度。 APS生产程软件
    的头像 发表于 11-10 11:00 269次阅读
    安达发|制药车间在“人脑”<b class='flag-5'>排</b>产?APS生产<b class='flag-5'>排</b>程软件才是智慧解药!

    基于 SRT4 的整数除法器的优化

    使用的基数r,即r=2b(其中b为每次迭代获得的结果位数)。虽然基数为64时每次迭代可以得到6位,理论上只需11个周期即可完成,但商选过程十分复杂,查找表的面积随着r成2的指数幂增长,即使是最小冗余也会
    发表于 10-23 07:23

    1688 拍立淘接口实战:从图像优化、工厂排序到供应链匹配(附可跑代码)

    深耕B2B电商十余年,亲历1688拍立淘接口20+坑:从图像预处理、权限申请到工厂排序。本文详解核心参数、实战代码及多图验证、定制方案生成等高级技巧,助你实现“看图找厂”精准匹配,附可运行代码,新手也能少走两年弯路。
    的头像 发表于 10-09 10:39 295次阅读

    使用env工具 生成的mdk工程 中的 头文件路径太乱了怎么解决?

    能不能按照相似路径归类排序
    发表于 09-16 07:46

    国际首创新突破!中国团队以存算一体排序架构攻克智能硬件加速难题

    2025 年 6 月 25 日,北京大学团队在智能计算硬件方面取得领先突破,国际上首次实现了基于存算一体技术的高效排序硬件架构 (A fast and reconfigurable
    的头像 发表于 07-02 16:50 557次阅读
    国际首创新突破!中国团队以存算一体<b class='flag-5'>排序</b>架构攻克智能硬件加速难题

    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    Analog Devices MAX16895监控电路是小型、低功耗、电压监控电路,具有排序功能。这些器件具有可调的、低至0.5V的电压监控阈值,并可利用外部电容调节延迟时间。这些Analog Devices器件非常适合用于电源排序、复位
    的头像 发表于 06-26 09:34 558次阅读
    Analog Devices Inc. MAX16895 监控电路特性/应用/功能图

    低成本电源排序器解决方案

    绝大多数负载点DC-DC转换器可以将上一个转换器的电源就绪输出连接至下一个转换器的使能输入,实现上电排序。这种方法只适合比较简单的设计,不能满足多数现代微处理器和DSP的要求一这类器件要求断电顺序必须与上电顺序相反。许多厂商针对这类应用推出了可编程排序IC,但器件价格较为
    的头像 发表于 05-21 09:55 967次阅读
    低成本电源<b class='flag-5'>排序</b>器解决方案

    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的排序功能技术资料

    和管理。 UCD9224 旨在为非隔离式 DC/DC 转换器应用提供各种理想的功能,同时通过减少外部电路来最大限度地减少系统组件总数。该解决方案将多回路管理与排序、裕度、跟踪和智能相位管理集成在一起,以优化整体系统效率。此外,还支持环路补偿和校准,无需添加外部元件。
    的头像 发表于 03-28 15:44 569次阅读
    UCD9224 2 MHz、2 轨、4 相数字 PWM 降压控制器,具有改进的<b class='flag-5'>排序</b>功能技术资料

    基数字钥匙平台正式上线

    领先的汽车智能化解决方案供应商上海银基科技股份有限公司正式宣布,旗下支持Apple钱包中的数字车钥匙接入的银基数字钥匙平台正式上线,该平台全面适配CCC国际标准,标志着数字钥匙全球化部署进程取得重要进展。
    的头像 发表于 02-28 13:47 865次阅读

    Phase Lab铝基数据库,赋能7xxx系铝合金开发设计

    高性能铝合金的研发和应用是我国新材料产业发展规划以及国家重点研发计划的重要支持方向。7xxx系铝合金,核心成分包括Al、Zn(占比5%-8%)、Mg(占比0.5%-2.5%)和Cu(占比1%-2%),添加微量Ti和Zr元素可增强合金的焊接性,引入微量的Sc元素可对合金晶粒进行细化。7xxx系铝合金具有高强、轻质、良好的塑性、焊接性以及低温性能等特点,广泛应用于航空航天、高速列车、汽车制造和高端电子产品等领域,是追求高性能和轻量化的重要材料。 以7xxx系铝合金的开
    的头像 发表于 01-15 09:56 1589次阅读
    Phase Lab铝<b class='flag-5'>基数</b>据库,赋能7xxx系铝合金开发设计

    详解Linux sort命令之掌握排序技巧与实用案例

    在linux系统使用过程中,提供了sort排序命令,支持常用的排序功能。 常用参数 sort命令支持很多参数,常用参数如下:   短参数 长参数 说明 -n – number-sort 按字符串数值
    的头像 发表于 01-09 10:10 1597次阅读

    Phase Lab镍基数据库,辅助开发Ni-AI-Cr-X系高温合金

    Phase Lab  镍基数据库 辅助开发Ni-AI-Cr-X系高温合金 Ni-Al-Cr-X四元系(X=Mo、Ti和W),基于γ基体相(FCC_A1结构)与γ'有序相(FCC_L12结构
    的头像 发表于 01-08 11:29 1567次阅读
    Phase Lab镍<b class='flag-5'>基数</b>据库,辅助开发Ni-AI-Cr-X系高温合金

    TimSort:一个在标准函数库中广泛使用的排序算法

    在计算机科学的领域,排序算法是每位学生必学的基础,而排序的需求是每位程序员在编程过程中都会遇到的。 在你轻松调用 .sort() 方法对数据进行排序时,是否曾好奇过,这个简单的方法背后
    的头像 发表于 01-03 11:42 962次阅读

    Phase Lab镍基数据库,驱动高性能Ni-AI-Co-Cr系合金设计

    Phase Lab  镍基数据库 驱动高性能Ni-AI-Co-Cr系合金设计 镍基合金以优异的高温强度、耐蚀和耐磨等性能,广泛应用于航空发动机、燃气轮机等高温工作部件以及化工、医疗和海洋工程等腐蚀性
    的头像 发表于 12-31 10:12 1321次阅读
    Phase Lab镍<b class='flag-5'>基数</b>据库,驱动高性能Ni-AI-Co-Cr系合金设计