好程序员Java学习路线分享5分钟了解基数排序

  好程序员 Java 学习路线分享 5 分钟了解基数排序, 前言: 基数排序无需进行比较和交换,而是利用分配和收集两种基本操作实现排序。基数排序分为两种:第一种是 LSD  ,从最低位开始排序;第二种是  MSD , 从最高位开始排序。

基数排序思想介绍

  1. 分配:对于数字,每位的取值范围是 0-9 ,因此需要 10 个容器(我们可以将其称为桶),这 10 个桶标号为 0-9 。每趟排序时,我们取每一个元素在该位的数值依次放入桶中。

2.  收集:在一趟排序完成后,我们按顺序从 0-9 的桶中依次取元素。

3.  继续进行分配和收集,直到最大位数排序完成。

算法说明:

待排序数据: 12, 34, 2, 123, 25, 59, 37

采用 LSD ,从低位开始排序

第一轮:取个位数,放入对应的桶,比如 12 的个位数是 2 ,放到 2 号桶; 34 的个位数是 4 ,放到 4 号桶


第一轮后,得到数据: 12, 2, 123, 34, 25, 37, 59

第二轮:取十位数,放入桶中。比如 2 ,十位数是 ,放到 号桶


第二轮后,得到数据: 2, 12, 123, 25, 34, 37, 59

第三轮:取百位数,放入桶


最后,得到有序数据  2, 12, 25, 34, 37, 59, 123

基数排序的代码实现

  1. private   static   void  radixSort( int [] arr) {  
  2. //存储最大值,暂时记录为第一个元素  
  3. int  max = arr[0];  
  4. //获取待排序数组中的最大值  
  5. for  ( int  v : arr) {  
  6. if  (v > max) {  
  7. max = v;  
  8. }  
  9. }  
  10. // 用列表表示桶,一共10个桶,每个桶对应的元素也是列表  
  11. List<List<Integer>> list =  new  ArrayList<List<Integer>>();  
  12. for ( int  i  = 0; i < 10; i ++) {  
  13. list.add( new  ArrayList<Integer>());  
  14. }  
  15. // 确定循环轮数  
  16. for ( int  i = 0, factor = 1; i < max; factor *= 10, i ++) {  
  17. for ( int  j = 0; j < arr.length; j ++) {  
  18. // 根据相应的位(个位/十位...)取通号,然后将数据放入桶中  
  19. list.get((arr[j] / factor) % 10).add(arr[j]);  
  20. }  
  21. // 遍历桶,将其中数据放入arr数组中  
  22. for ( int  j = 0, k = 0; j < list.size(); j ++) {  
  23. while (!list.get(j).isEmpty()) {  
  24. arr[k] = list.get(j).get(0);  
  25. list.get(j).remove(0);  
  26. k++;  
  27. }  
  28. }  
  29. }  
  30. }   

 

总结

基数排序是一种按记录关键字的各位值逐步进行排序的方法。一般适用于记录的关键字为整数类型的情况,对于字符串和文字排序不适合。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69913892/viewspace-2652971/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/69913892/viewspace-2652971/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值