数据结构算法介绍之基数排序(Radix Sort)

一、基数排序算法简介

(1)概念:基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。

基数排序是非比较型整数排序算法,其原理是将整数按位分割进行排序。基数排序适用于大范围数据排序,打破了计数排序的限制。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

(2)2种排序方式:

最低位优先法(LSD):从最低位向最高位依次按位进行排序。

最高位优先法(MSD):从最高位向最低位依次按位进行排序。

(3)按位分割小技巧

arr[i] / digit % 10,其中digit为10^n。

总结:

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。

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

二、基数排序算法示意图:

三、基数排序算法代码展示:

C语言代码:

#include<math.h>
testBS()
{inta[] = {2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3};int *a_p = a;//计算数组长度intsize = sizeof(a) / sizeof(int);//基数排序bucketSort3(a_p, size);//打印排序后结果inti;for(i = 0; i < size; i++){printf("%d\n", a[i]);}intt;scanf("%d", t);
}
//基数排序
voidbucketSort3(int *p, intn)
{//获取数组中的最大数intmaxNum = findMaxNum(p, n);//获取最大数的位数,次数也是再分配的次数。intloopTimes = getLoopTimes(maxNum);inti;//对每一位进行桶分配for(i = 1; i <= loopTimes; i++){sort2(p, n, i);}
}
//获取数字的位数
intgetLoopTimes(intnum)
{intcount = 1;inttemp = num / 10;while(temp != 0){count++;temp = temp / 10;}returncount;
}
//查询数组中的最大数
intfindMaxNum(int *p, intn)
{inti;intmax = 0;for(i = 0; i < n; i++){if(*(p + i) > max){max = *(p + i);}}returnmax;
}
//将数字分配到各自的桶中,然后按照桶的顺序输出排序结果
voidsort2(int *p, intn, intloop)
{//建立一组桶此处的20是预设的根据实际数情况修改intbuckets[10][20] = {};//求桶的index的除数//如798个位桶index=(798/1)%10=8//十位桶index=(798/10)%10=9//百位桶index=(798/100)%10=7//tempNum为上式中的1、10、100inttempNum = (int)pow(10, loop - 1);inti, j;for(i = 0; i < n; i++){introw_index = (*(p + i) / tempNum) % 10;for(j = 0; j < 20; j++){if(buckets[row_index][j] == NULL){buckets[row_index][j] = *(p + i);break;}}}//将桶中的数,倒回到原有数组中intk = 0;for(i = 0; i < 10; i++){for(j = 0; j < 20; j++){if(buckets[i][j] != NULL){*(p + k) = buckets[i][j];buckets[i][j] = NULL;k++;}}}
}

JAVA语言:

public class RadixSort
{public static void sort(int[] number, int d) //d表示最大的数有多少位{intk = 0;intn = 1;intm = 1; //控制键值排序依据在哪一位int[][]temp = newint[10][number.length]; //数组的第一维表示可能的余数0-9int[]order = newint[10]; //数组order[i]用来表示该位是i的数的个数while(m <= d){for(inti = 0; i < number.length; i++){intlsd = ((number[i] / n) % 10);temp[lsd][order[lsd]] = number[i];order[lsd]++;}for(inti = 0; i < 10; i++){if(order[i] != 0)for(intj = 0; j < order[i]; j++){number[k] = temp[i][j];k++;}order[i] = 0;}n *= 10;k = 0;m++;}}public static void main(String[] args){int[]data ={73, 22, 93, 43, 55, 14, 28, 65, 39, 81, 33, 100};RadixSort.sort(data, 3);for(inti = 0; i < data.length; i++){System.out.print(data[i] + "");}}
}

Python语言:

#!/usr/bin/env python
#encoding=utf-8import mathdef sort(a, radix=10):"""a为整数列表, radix为基数"""K = int(math.ceil(math.log(max(a), radix))) # 用K位数可表示任意整数bucket = [[] for i in range(radix)] # 不能用 [[]]*radixfor i in range(1, K+1): # K次循环for val in a:bucket[val%(radix**i)/(radix**(i-1))].append(val) # 析取整数第K位数字 (从低到高)del a[:]for each in bucket:a.extend(each) # 桶合并bucket = [[] for i in range(radix)]

四、基数排序算法性能分析:

时间效率 [1]  :设待排序列为n个记录,d个关键码,关键码的取值范围为radix,则进行链式基数排序的时间复杂度为O(d(n+radix)),其中,一趟分配时间复杂度为O(n),一趟收集时间复杂度为O(radix),共进行d趟分配和收集。 空间效率:需要2*radix个指向队列的辅助空间,以及用于静态链表的n个指针。

数据结构算法———基数排序相关推荐

  1. 7.使用php描述冒泡排序,PHP 数据结构 算法描述 冒泡排序 bubble sort

    PHP 数据结构 算法描述 冒泡排序 bubble sort 复制代码 代码如下: /** * 冒泡排序 bubble sort * * 原理:多次循环进行比较,每次比较时将最大数移动到最上面.每次循 ...

  2. 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

    文章目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构 ...

  3. 数据结构算法,学习笔记

    算法学习资源 93k 算法小抄.leetcode https://github.com/labuladong/fucking-algorithm 算法可视化https://visualgo.net/z ...

  4. 数据结构算法集---C++语言实现

    /// // // // 堆栈数据结构 stack.h // // // /// #include<iostream.h> template<class Type>class ...

  5. 横空出世,席卷Csdn [评微软等公司数据结构+算法面试100题]

    横空出世,席卷Csdn ---评微软数据结构+算法面试100题 作者:July 时间:2010年10月-11月.版权所有,侵权必究. --------------------------------- ...

  6. 微软等数据结构+算法面试100题全部答案集锦

    微软等数据结构+算法面试100题全部答案集锦 作者:July.阿财. 时间:二零一一年十月十三日. 引言 无私分享造就开源的辉煌. 今是二零一一年十月十三日,明日14日即是本人刚好开博一周年.在一周年 ...

  7. 横空出世,席卷互联网--评微软等公司数据结构+算法面试100题

    横空出世,席卷互联网                                                                          ---评微软数据结构+算法面试1 ...

  8. [整理I]精选微软等公司数据结构+算法面试100题 [第1-40题]

    精选微软等公司,数据结构+算法,经典面试100题                                       --------之前40题 --------------- ------- ...

  9. Interview:算法岗位面试—10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法、回归算法、聚类算法等细节考察

    ML岗位面试:10.29下午上海某电子(偏传统ML算法,外企)数据结构算法+晚上国内某保险公司(偏AI算法,世界500强)技术面试之分类算法.回归算法.聚类算法等细节考察 Interview:算法岗位 ...

最新文章

  1. 手机验证短信设计与代码实现(转载)
  2. awk 内嵌正则 提取字符串_干货-Shell编程文本处理三剑客之-awk
  3. python中格式化字符串_Python中所有字符串格式化的指南
  4. Python如何生成windows可执行的exe文件
  5. linux的基础知识——UDP
  6. 教育部统考 计算机应用,9月教育部统考《计算机应用基础》试卷一附答案.doc
  7. css实现三栏布局的几种方法及优缺点
  8. Java回顾之JDBC
  9. sql脚本导入sql_学习SQL:SQL脚本
  10. LINUX---安装Hadoop集群时,把hadmin用户的shell脚本添加到开机自启动脚本
  11. UE4启动GameActivity
  12. (动态规划)股票交易日问题
  13. 让NotePad++高亮显示SQLite关键字
  14. Mono for Android 实现高效的导航
  15. 阻止冒泡在浏览器的兼容问题
  16. Modem2G/3G/4G/5G:解决TDS-CDMA:HSDPA:能注册上call box,但无法连接(Integrity protection not activated)
  17. element走马灯自动_vue Element UI走马灯组件重写
  18. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇...
  19. iview 加载html文件,iview-admin开发文档
  20. 港科夜闻|香港科大与中国联通成立联合实验室,推动智慧社会研究发展

热门文章

  1. android代码密码隐藏,android 显示密码和隐藏密码
  2. WebMagic 爬虫框架问题描述
  3. 全国二级c语言报名官网,计算机二级考哪些内容(全国计算机报名入口)
  4. 什么是I2C,I2C怎么用,从实例波形分析I2C读写
  5. jQuery获取当前标签的id
  6. Oracle里面containskey,containskey(containskey方法)
  7. ARM7 低级错误
  8. 8位移位相加乘法器-Verilog
  9. Sensor ISP 图像信号处理系统
  10. 计算机应用里面的题,计算机应用教程习题解答与上机练习