1.数据结构学习之基数排序(含C++代码)

1.1.概念

  基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

1.2.基本解法

1.2.1第一步

     以下面的一列数为例,假设原来有一串数值如下所示:

     73, 22, 93, 43, 55, 14, 28, 65, 39, 81

     首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:

     0

     1 81

     2 22

     3 73 93 43

     4 14

     5 55 65

     6

     7

     8 28

    9 39

1.2.2第二步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:

    81, 22, 73, 93, 43, 14, 55, 65, 28, 39

    接着再进行一次分配,这次是根据十位数来分配:

    0

    1 14

    2 22 28

    3 39

    4 43

    5 55

    6 65

    7 73

    8 81

    9 93

1.2.3第三步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:

   14, 22, 28, 39, 43, 55, 65, 73, 81, 93

    这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。

LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。

代码如下:


/*算法:基数排序*/#include <iostream>using namespace std;
/*********************************************************
Function:rxsort
Description:基数排序
Input:数组A[l,h];数组中最大元素的位数d,例如最大数为999,则d为3;进制数k,如果是10进制数,k为10;
Output:排序好的数组;
Others:对数字1234来说,预定第0位为4,第1位为3,依次类推;
*********************************************************/
bool rxsort(int A[],int l,int h,int d,int k){if(NULL==A||l>h)return false;int size = h-l+1;int* counts = new int[k];//用于计数排序的辅助数据,详见计数排序int* temp = new int[size];//用于存储重新排序的数组int index;int pval=1;//依次处理不同的位for(int i=0;i<d;i++){//counts数组清零for(int j=0;j<k;j++)counts[j] = 0;for(int j=l;j<=h;j++){/*1.data[j]/pval:去掉数字data[j]的后i个数,例如:当data[j]=1234,i=2时,此时pval=100,data[j]/pval=12;2.(data[j]/pval)%k:取数字data[j]/pval的最后一位数3.(int)(data[j]/pval)%k:取数字data[j]的第i位数*/index = (int)(A[j]/pval)%k;/*统计数组A中每个数字的第i位数中各个数字的频数,用于计数排序;*/counts[index]++;}//计算累加频数,用户计数排序for(int j=1;j<k;j++)counts[j] = counts[j] + counts[j-1];//使用倒数第i+1位数对A进行排序for(int j=h;j>=l;j--){index = (int)(A[j]/pval)%k;temp[counts[index]-1] = A[j];counts[index]--;}//将按第i为数排序后的结果保存回数组A中for(int j=0;j<size;j++)A[j+l] = temp[j];//更新pvalpval = pval*k;}delete[] counts;delete[] temp;
}int main(){int A[] = {73, 22, 93, 43, 55, 14, 28, 65, 39, 81};rxsort(A,0,9,2,10);for(int i=0;i<10;i++)cout<<A[i]<<" ";
}

运行结果如下:

数据结构学习之基数排序(含C++代码)相关推荐

  1. 数据结构学习笔记——基数排序 | 排序算法总结

    目录 一.基数排序排序思想 二.基数排序算法分析 三.排序算法总结 (一)分类 (二)比较 (三)详细分析 一.基数排序排序思想 基数排序与前面的排序算法不一样,它不基于比较和移动元素来进行排序,而是 ...

  2. 论文学习笔记: Learning Multi-Scale Photo Exposure Correction(含pytorch代码复现)

    论文学习笔记: Learning Multi-Scale Photo Exposure Correction--含pytorch代码复现 本章工作: 论文摘要 训练数据集 网络设计原理 补充知识:拉普 ...

  3. 【动手教你学故障诊断:Python实现Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码)】

    项目名称 动手教你学故障诊断:Python实现基于Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码) 项目介绍 该项目使用tensorflow和keras搭建深度学习C ...

  4. 数据结构学习笔记(王道)

    数据结构学习笔记(王道) PS:本文章部分内容参考自王道考研数据结构笔记 文章目录 数据结构学习笔记(王道) 一.绪论 1.1. 数据结构 1.2. 算法 1.2.1. 算法的基本概念 1.2.2. ...

  5. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  6. 数据结构学习笔记(七):哈希表(Hash Table)

    目录 1 哈希表的含义与结构特点 1.1 哈希(Hash)即无序 1.2 从数组看哈希表的结构特点 2 哈希函数(Hash Function)与哈希冲突(Hash Collision) 2.1 哈希函 ...

  7. python数据结构的应用场景不包括,Python 数据结构学习

    Python 数据结构学习 列表 list.append(x) 在列表的末尾添加一个元素.相当于 a[len(a):] = [x] . list.extend(iterable) 使用可迭代对象中的所 ...

  8. 邓俊辉数据结构学习笔记3-二叉树

    二叉树及其表示 树 有根树 从图论的角度看,树等价于连通无环图.因此与一般的图相同,树也由一组项点〈vertex)以及联接与其间的若干条边〈edge) 组成.在计算机科学中,往往还会在此基础上,再指定 ...

  9. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  10. matlab去除大跳变,一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码)...

    一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码) 一种快速灰度校正算法(处理亮度不均等情况)(含MATLAB代码) 文章目录 前言 一.MATLAB代码 二.结果示例 总结 前言 方法 ...

最新文章

  1. # Qt程序版本号使用
  2. iOS--资源--优秀app发掘
  3. CentOS文件浏览器设置
  4. python无法打印unicode编码_【整理】Python中实际上已经得到了正确的Unicode或某种编码的字符,但是看起来或打印出来却是乱码...
  5. Wi-Fi信号满格网速就一定快吗?
  6. JVM内存管理------GC算法精解(五分钟让你彻底明白标记/清除算法)
  7. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构
  8. chmod命令用法linux,Linux下chmod命令详细介绍及用法举例
  9. HaaS Python 云端一体AI 车型识别功能
  10. H3C无线控制器做用户隔离和DHCP Relay的注意事项
  11. 推荐算法-GBDT与LR算法融合
  12. Spark 小文件合并优化实践
  13. 2021年茶艺师(中级)考试及茶艺师(中级)考试试卷
  14. matlab怎么把音频变成信号_利用MATLAB软件对音频信号进行频谱分析及处理.doc
  15. Win10电脑怎么更改UEFI固件设置
  16. H263H264MPEG4
  17. Java Word转PDF
  18. Android Drawable图标生成工具
  19. iOS runloop
  20. html中iframe标签的用法详解

热门文章

  1. (五)工作中,工作外
  2. 在Linux Mint 19.2 XFCE(x64)中安装Canon LBP2900+打印机驱动程序
  3. 如何启用计算机安全模式,怎么进入电脑安全模式
  4. 读书笔记:在改变的时代改变自己
  5. 底部版权html5代码,版权设置底部-网页底部版权信息怎么修改?
  6. 物联网专业要学c语言吗,物联网应用技术专业是文科还是理科
  7. php socket http,php 利用socket发送HTTP请求
  8. 今日头条小程序是什么
  9. 通俗地讲一下庞加莱猜想是怎么回事(from 鼓浪)
  10. php导入mib表,Linux snmp导入MIB库