problem a: 简单的整数排序_学习笔记-详解基数排序

news/2024/7/7 15:27:11

本文目的

上一章节已经详细的向大家介绍过排序的相关概念(详见学习笔记-排序简单介绍) ,本文旨在为大家详细的介绍基数排序。

基数排序

基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的至某些"桶"中,以达到排序的作用,基数排序法是属于稳定性的排序,在某些时候,基数排序法的效率高于其它的稳定性排序法。

基本思想

基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。具体做法是:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

实现方法

最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd对各子组排序后。再将各组连接起来,便得到一个有序序列。

最低位优先(Least Significant Digit first)法,简称LSD法:先从kd开始排序,再对kd-1进行排序,依次重复,直到对k1排序后便得到一个有序序列。

实现原理

基数排序的发明可以追溯到1887年赫尔曼·何乐礼在打孔卡片制表机(Tabulation Machine)上的贡献。它是这样实现的:将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

基数排序的方式可以采用LSD(Least significant digital)或MSD(Most significant digital),LSD的排序方式由键值的最右边开始,而MSD则相反,由键值的最左边开始。

排序示例

在下图中,从最低位开始,依次进行排序。

1,按照个位数进行排序。

2,按照十位数进行排序。

3,按照百位数进行排序。

801b5650dc0b702ca205ae653e59eefd.png

算法实现

#include  #define elemType int /*元素类型*/#define MAX 10 //元素个数 int k=1;//轮次记录 //打印函数 void Print (elemType arr[], int len){int i;for (i=0; i m) {      m = a[i];    }  }  while (m / exp > 0) {    int bucket[MAX] = { 0 };    for (i = 0; i < n; i++) {      bucket[(a[i] / exp) % MAX]++;    }    for (i = 1; i < MAX; i++) {      bucket[i] += bucket[i - 1];    }    for (i = n - 1; i >= 0; i--) {      b[--bucket[(a[i] / exp) % MAX]] = a[i];    }    for (i = 0; i < n; i++) {      a[i] = b[i];    }    exp *= MAX;    printf("第===%d===轮排序后结果如下:",k);Print (a, MAX);k=k+1;  }}void main() {int i;    elemType arr[MAX] = {94,19,29,9,11,1,627,14,13,29};    printf("待排序的序列为:");    Print(arr, MAX);      printf("");        Sort (arr,10);    printf("");    printf("排好序的结果如下:");    Print(arr, MAX);       }
0c9da2466a3dae9812666251ea04653f.png

算法分析

初看起来,基数排序的执行效率似乎好的让人无法相信,所有要做的只是把原始数据项从数组复制到链表,然后再复制回去。如果有10个数据项,则有20次复制,对每一位重复一次这个过程。假设对5位的数字排序,就需要205=100次复制。如果有100个数据项,那么就有2005=1000次复制。复制的次数与数据项的个数成正比,即O(n)。这是我们看到的效率最高的排序算法。

不幸的是,数据项越多,就需要更长的关键字,如果数据项增加10倍,那么关键字必须增加一位(多一轮排序)。复制的次数和数据项的个数与关键字长度成正比,可以认为关键字长度是N的对数。因此在大多数情况下,基数排序的执行效率倒退为O(N*logN),和快速排序差不多。具体总结如下图。

20f0c4ea67cde5fa3a27fe04767fe01c.png

本文的初衷为学习笔记的分享,部分图文来源于网络,如侵,联删。


http://www.niftyadmin.cn/n/3013090.html

相关文章

主治医生计算机怎么选报科目,内科主治医师人机对话考试常见问题

医学教育网搜集整理卫生资格考试人机对话常见问题&#xff0c;分享给大家&#xff0c;如下&#xff1a;什么是“人机对话”人机对话是借助计算机及网络技术对考试进行实施、管理的一种测试形式&#xff1b;它可以根据考试设计的需求&#xff0c;有针对性地进行命题、组卷&#…

fastjson版本_Fastjson 被曝出“高危”远程代码执行漏洞

5 月 28 日&#xff0c;360 网络安全响应中心(360-CERT)发布“Fastjson 远程代码执行漏洞通告”。通告称&#xff0c; Java 库 fastjson < 1.2.68 版本存在远程代码执行漏洞&#xff0c;漏洞被利用可直接获取服务器权限。360 网络安全响应中心评定其为“高危漏洞”&#xff…

Android开发之多媒体——显示手机存储的图片

在Android中多媒体文件&#xff08;音乐/视频/图片&#xff09;是通过MediaStore来统一管理的&#xff0c;本文所演示的例子是通过MediaStore获取手机存储中的图片&#xff0c;然后在Gallery中显示出来。例子最后的效果&#xff1a;下面先贴出本文需要添加和修改的文件&#xf…

python在水文领域中的应用_python在水利工程或者水文方向上有什么案例可以学习一下么?或者还要学什么库。?...

Python在水文水利方面的用途我接触过的大概四类。 一是画图&#xff0c;这个主要是用matplotlib。matplotlib基本是照搬matlab的画图功能&#xff0c;很多命令都不带改的&#xff0c;如果你没有正版matlab&#xff08;又不愿意用盗版&#xff09;&#xff0c;完全可以用matplot…

Android开发之dp

关于Android的dp和sp单位&#xff0c;相信大家一定有很多疑问&#xff1f;下面的答案直接来自本人在知乎的回答。出处&#xff1a;http://www.zhihu.com/question/20697111/answer/227226711.在Xdpi下绘制Xpx长度&#xff0c;实际的物理距离都是1英寸&#xff0c;为什么一定要选…

python顺序结构的表示_Python学习笔记3——三大结构:顺序,分支,循环3

顺序 自上而下&#xff0c;依次执行 分支 分支的基本语法 if 条件表达式&#xff1a; 语句1 语句2 语句3 ...... 条件表达式就是计算结果必须为布尔值的表达式 表达式后面的冒号不能少 注意if后面的出现的语句&#xff0c;如果属于if语句块&#xff0c;则必须同一个锁紧等级 条…

计算机设置调整吃鸡,《绝地求生》最全设置调整知识,让你的低配电脑也能享受高配画质...

《绝地求生》大热&#xff0c;steam销量突破2000万大关&#xff0c;中国玩家占了绝大多数&#xff0c;国内近日也掀起了“吃鸡潮”&#xff0c;但与此同时&#xff0c;不少玩家反应“吃鸡”对配置要求太高了&#xff0c;自己家去年买的电脑今年就带不起了&#xff0c;其实喷饭君…

python打开txt文件找不到_电脑上打开方式找不到了怎么办?

驱动哥最近所在的城市下了暴雨&#xff0c;不知道你们的城市天气怎么样呢&#xff1f;日常问候完毕&#xff0c;下面是今日份的技术教程&#xff0c;请各位大佬们放心“食用”哦。大家在日常使用电脑时有没有注意到&#xff0c;无论是Win7 还是 Win10 系统&#xff0c;当你的每…