基数排序(radix sort)

1.基本介绍

1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用。
2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法。
3)基数排序(Radix Sort)是桶排序的扩展
4)基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。

2.基本思想

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

3.基数排序图文说明

将数组 {53, 3, 542, 748, 14, 214} 使用基数排序, 进行升序排序


  • 基数排序的说明:
    (1)基数排序是对传统桶排序的扩展,速度很快.
    (2)基数排序是经典的空间换时间的方式,占用内存很大, 当对海量数据排序时,容易造成 OutOfMemoryError 。
    (3)基数排序时稳定的。[注:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的]
    (4)有负数的数组,我们不用基数排序来进行排序, 如果要支持负数,访问支持负数的基数排序
    -代码:
import java.util.Arrays;public class RadixSort {public static void main(String[] args) {/*int arr[] = { 53, 3, 542, 748, 14, 214};System.out.println("排序之前: " + Arrays.toString(arr));radixSort(arr);System.out.println("排序之后: " + Arrays.toString(arr));*/int arr[] = new int[8000000];int temp[] = new int[arr.length];for (int i = 0; i < 8000000; i++) {arr[i] = (int)(Math.random() * 1000000000);  //随机生成一个[0,1000000)之间的数}//开始时间long startTime = System.currentTimeMillis();radixSort(arr);long endTime = System.currentTimeMillis();System.out.println("排序花了: " + (endTime - startTime) + "ms");}//基数排序public static void radixSort(int arr[]){//1.得到该数组中最大的值int max = arr[0]; //假设第一个数为最大for (int i = 0; i < arr.length; i++) {if(arr[i] > max){max = arr[i];}}//计算得到的最大的数时几位数(这里实现的基数排序不能给负数排序)int maxLength = (max + "").length();//2.定义一个二维数组,表示10个桶,每一个一维数组就是一个桶//说明://(1)二维数组包含10个一维数组//(2)为了防止在放入数的时候数据溢出,将每个桶(一维数组)大小定义为arr.length//(3)基数排序是典型的空间换时间的算法int bucket[][] = new int[10][arr.length];//为了记录每个桶中实际有多少个数据,需要定义一个一维数组来记录每个桶中每次放入的数据的个数//例如:bucketElementCounts[1]就表示bucket[1]这个桶中实际存放的数据的个数int[] bucketElementCounts = new int[10];for (int i = 0, n = 1; i < maxLength; n *= 10, i++) {  //数组中最大数是几位,外循环就是多少次for (int j = 0; j < arr.length; j++) {//判断每个数的个/十/百...的位数是多少,第一轮计算个位数,第二轮计算十位数...int digitOfElement = arr[j] / n % 10;bucket[digitOfElement][bucketElementCounts[digitOfElement]++] = arr[j];}//将数按照规则放入桶中之后,在按序从桶中取出数据放入arr数组中int index = 0;for (int k = 0; k < bucketElementCounts.length; k++) {//如果桶中有数据,则将其放入原数组中if(bucketElementCounts[k] != 0){for (int l = 0; l < bucketElementCounts[k]; l++) {arr[index++] = bucket[k][l];}}//每(i+1)轮处理完之后,都需要将bucketElementCounts[k] = 0,重新置位0 !!!!bucketElementCounts[k] = 0;}
//            System.out.println("第" + (i + 1) + "轮处理后:" + Arrays.toString(arr));}}}

基数排序(radix sort)相关推荐

  1. C语言实现基数排序Radix sort算法之二(附完整源码)

    基数排序Radix sort算法 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) #includ ...

  2. C语言实现基数排序Radix sort算法之一(附完整源码)

    基数排序Radix sort算法 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) 基数排序Radix sort算法的完整源码(定义,实现,main函数测试) #includ ...

  3. php排序算法算法,PHP排序算法之基数排序(Radix Sort)实例详解

    本文实例讲述了PHP排序算法之基数排序(Radix Sort).分享给大家供大家参考,具体如下: 基数排序在<大话数据结构>中并未讲到,但是为了凑齐八大排序算法,我自己通过网络学习了这个排 ...

  4. GPU基数排序(CUDA radix sort)

    GPU基数排序(CUDA radix sort) 引言:基数排序是具有固定迭代次数的排序算法, 其通过对最低位到最高位的一一比较,对数值排序.本文将介绍基数排序的并行实现方法,主要包括并行基数排序.并 ...

  5. Java实现基数排序及其推导过程 Radix Sort

    本文带来八大排序算法之基数排序. 基数排序(radix sort)属于"分配式排序"(distribution sort),又称"桶子法"(bucket sor ...

  6. C++radix sort基数排序的实现算法之一(附完整源码)

    C++radix sort基数排序的实现算法 C++radix sort基数排序的实现算法完整源码(定义,实现,main函数测试) C++radix sort基数排序的实现算法完整源码(定义,实现,m ...

  7. C++radix sort基数排序的实现算法之二(附完整源码)

    C++radix sort基数排序的实现算法 C++radix sort基数排序的实现算法完整源码(定义,实现,main函数测试) C++radix sort基数排序的实现算法完整源码(定义,实现,m ...

  8. count sort, radix sort, bucket sort

    count sort, radix sort, bucket sort 标签(空格分隔): algorithms 基于比较的排序算法,都逃不过O(nlogn)O(nlogn)O(nlogn)的宿命1. ...

  9. java radix sort_用于Radix Sort的Java程序

    基数排序是一种排序技术,可根据每个元素(或数字)中的每个数字对元素进行排序.基于一个位数(也称为最低有效位数)和十位数(也称为最高有效位数),数百个位数等等,对元素进行排序. 示例 以下是Java中R ...

最新文章

  1. Android开发优化之——对界面UI的优化(经验分享)
  2. 【AC自动机】【字符串】【字典树】AC自动机 学习笔记
  3. 这场景像不像你修Bug的样子?
  4. [原]Oracle删除大表并回收空间的过程
  5. Spring的新注解——Configuration、ComponentScan、Bean、Import、PropertySource || spring整合Junit分析
  6. 竖直手风琴导航菜单栏
  7. 【笔记】opencv图像运算 图像加密
  8. Cookie和Session的作用和工作原理
  9. Postgres访问其他PostgresQL数据库的功能DBLINK
  10. 【原】jQuery easyUI 快速搭建前端框架
  11. 灵活的Zend Framework之使用自定义的Frontcontroller
  12. 【go网络编程】-HTTP编程
  13. 记一次Maya入门之材质和模型的导出
  14. 开源词典软件-GoldenDict
  15. 连接mysql超时_数据库连接超时的原因及其解决方法
  16. 群签名和环签名的区别_环签名,聚合签名
  17. [work]马尔可夫链 (Markov Chain)是什么鬼
  18. python web微信应用(三) 微信智能聊天机器人
  19. io多线程 性能 扯犊子
  20. 群晖NAS教程(二十)、利用Docker安装zdir搭建个人云盘

热门文章

  1. mysql查看check约束_关于MYSQL 检查check约束
  2. Oracle账号登录
  3. 妇女节报告解读|揭示618小红书营销新趋势
  4. office 2016 for mac 工具栏小三角下拉无法展开问题
  5. PID控制器的远程设定点功能及其应用
  6. It doesn‘t look good for a date“: Transforming Critiques into Preferences for CRS
  7. SAP 附件清单管理
  8. Mac 下导出ANR错误日志
  9. 最新!“2020年中国大学百强榜”出炉,排名前10的是这些高校
  10. windows cmd命令进入文件夹目录