基数排序不同前面的各种排序,它并不基于比较排序,而是采用多关键字排序。通常,按照低位至高位的顺序进行排序的,也就是最低位优先(LSD)。

本文也是采用最低位优先排序,代码是对简单的两位数进行基数排序,所采用的存储结构为二维数组,仅为说明基数排序的思想。在此基础上便可以进行多位数的排序,也可以采用链表进行存储,都是可以的。

计数排序过程可粗略的看为 分配-收集,分配-收集,.....,以最低位优先为例,第一次分配是按照数列的个位数分配到给定的存储结构中,分配好所有数之后,按顺序从存储结构一个个收集;第二次分配是按照数列的十位数进行分配,然后收集;再分配百位数,再收集......如对数列  7 10 46 31 29 30进行基数排序:

第一趟分配结果为(10,30),(31),(46),(7),(29)

第一趟收集结果为  10 30 31 46 7 29

第二趟分配结果为(7),(10),(29),(30,31),(46)

第二趟收集结果为  7 10 29 30 31 46      排序结束。

注:存储结构中应该是按照基数0~9排列的,而数列没有个位是2的数,如第一趟分配结果完整描述为:

(10,30),(31),(),(),(),(),(46),(7),(),(29)

基数排序的时间复杂度为 d趟分配和收集所需的时间,一趟分配的时间为o(n),一趟收集的时间最大为o(n+r),r为基数,本文中r为10。故其时间复杂度最大为o(d*(2n+r)); 空间复杂度最大为o(n+r);基数排序是稳定的。

完整代码如下:

#include<iostream>
#include<cstring>
#define N 20
void baseSort(int* arr, int num);
int back[10][10];//存储空间
int main()
{int a[N] = { 3, 2, 4, 6, 7, 5, 18, 9, 10, 1,16, 8, 20, 33, 28, 64, 19, 31, 30, 25 };for (int i = 0; i < N; i++){std::cout << a[i] << "  ";}std::cout << '\n';baseSort(a, N);for (int i = 0; i < N; i++){std::cout << a[i] << "  ";}std::cout << '\n';return 0;
}void baseSort(int* arr, int num)
{int i, j, temp;  for (i = 0; i < num; i++)//按个位分配{j = 0;temp = arr[i] % 10;while (back[temp][j] != 0)++j;back[temp][j] = arr[i];}j = 0;for (i = 0; i < 10; i++)//回收{temp = 0;while(back[i][temp] != 0)arr[j++] = back[i][temp++];}memset(back, 0, 400);//二维数组清零for (i = 0; i < num; i++)//按十位分配{j = 0;temp = arr[i] / 10;while (back[temp][j] != 0)++j;back[temp][j] = arr[i];}j = 0;for (i = 0; i < 10; i++)//回收{temp = 0;while (back[i][temp] != 0)arr[j++] = back[i][temp++];}
}

基数排序(c/c++)相关推荐

  1. 基数排序算法LSD实现

    基数排序算法的实质是用的分类的方式. LSD 按低位开始分类, 其实在按各位进行分类的时候就已经注定了 相同位数的数的相对大小关系了. lsd实现如下: #include <iostream&g ...

  2. 算法笔记-桶排序代码与原理、非比较排序、计数排序、基数排序、C#代码

    1. 计数排序 原理: 计数排序需要用到桶,其核心是不通过比较来获得数的大小,以桶的方式存数来计数 举例来说,一个数组是{3 2 2 1 3 5},共6个数,那么我们需要准备5个有序桶,即1号桶.2号 ...

  3. 基数排序算法(基于Java实现)

    title: 基数排序算法(基于Java实现) tags: 基数算法 基数排序算法原理及代码实现: 一.基数排序算法的原理 基数排序属于"分配式排序",又称"桶子法&qu ...

  4. 基数排序python实现

    基数排序python实现 基数排序 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或 ...

  5. 基数排序中的LSD方法和MSD方法

    最高位优先(Most Significant Digit first)法,简称MSD法:先按k1排序分组,同一组中记录,关键码k1相等,再对各组按k2排序分成子组,之后,对后面的关键码继续这样的排序分 ...

  6. 计数排序,基数排序,桶排序

    转 http://blog.163.com/yuyang_tech/blog/static/216050083201382055821953/ 与合并排序,堆排序,快速排序等基于比较的排序算法不同,计 ...

  7. Hark的数据结构与算法练习之基数排序

    算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...

  8. 数据结构:基数排序(Radix sort)

    import java.util.Arrays;public class RadixSort {public static void main(String[] args) {int[] arr = ...

  9. 数据结构——排序:插入排序、选择排序、交换排序、归并排序、基数排序

    排序 内部排序:数据量不大,在内存中可以完成排序. 外部排序:借助外存.把数据文件分成若干块,涉及内外存数据的转换.存储器的管理等. 稳定排序:能保证排序前两个相等的数其在序列的前后位置顺序和排序后它 ...

最新文章

  1. matplotlib将图绘制在多福图中
  2. 洛谷——P1290 欧几里德的游戏
  3. FTP服务器常规操作
  4. JAVA学习之网络编程UDP篇
  5. docker跑codalab_Codalab使用与采坑
  6. 机器学习模型融合stack详解及代码实战
  7. 2021亚太杯数学建模竞赛
  8. 编译Openwrt(LEDE)for K3固件详细指南
  9. 【加法器】——模拟电路设计简单的二进制数加法器
  10. 网站banner写法
  11. blastn 输出结果每列啥意思_NCBI在线BLAST用法详解
  12. 关于CM3/CM4位带操作的总结
  13. 管理员已阻止你运行此应用。有关详细信息,请与管理员联系。windows10
  14. excel排序求和:如何统计前几名数据合计 下篇
  15. premiere输出图像抖动的最终解答--转
  16. 如何实现用户不登记就不让用户继续使用正常功能
  17. 互联网日报 | 拼多多湖南卫视跨年晚会发100亿份红包;京东物流CEO王振辉辞职;恒大房车宝集团成立...
  18. android alarmmanager后台,Android AlarmManager实现定时循环后台任务
  19. JAVA获取ip的地址信息
  20. 【MFAC】基于偏格式动态线性化的无模型自适应控制

热门文章

  1. mongoose多条件模糊查询实例
  2. 搭建 Visual Studio 和 Freeglut、GLEW的OpenGL环境
  3. 获取设置本地当前默认打印机
  4. 如何访问“我的网站”
  5. Asp.net based Web Application部署后的问题
  6. RedHat Enterprise Linux 5 安装GCC过程
  7. vue中使用百度地图为啥是空白_vue中使用腾讯地图(尝试篇)
  8. ETCD-节点挂掉会怎样?
  9. 【数字信号处理】基本序列 ( 单位阶跃序列 | 单位阶跃序列与单位脉冲序列关系 | 矩形序列 | 矩形序列与单位阶跃序列关系 | 矩形序列作用 )
  10. 【Windows 逆向】使用 CE 工具挖掘关键数据内存真实地址 ( 查找子弹数据的动态地址 | 查找子弹数据的静态地址 | 静态地址分析 | 完整流程 ) ★