• 基数排序 java 实现


    基数排序 java 实现

    Wikipedia: Radix sort

    geeksforgeeks: Radix sort

    数学之美番外篇:快排为什么那样快

    Java排序算法总结(八):基数排序

    排序八 基数排序

    算法概念

    基数排序(radix sort)是一种非比较型整数排序算法,不同于比较排序算法(例如:堆排序、归并排序、快速排序),它不需要比较关键字的大小,而是根据关键字中各位的值,通过对排序的N个关键字进行若干趟“分配”与“收集”来实现排序的。根据其原理,基数排序不仅适用于整数排序,还可以进行字符串(比如名字或日期)和特定格式的浮点数排序。基数排序是稳定性的排序,在某些时候,基数排序法的效率高于其它的比较性排序法。

    算法思想

    基数排序可以分为两类:最高位优先(Most Significant Digit first)法和最低位优先(Least Significant Digit first)法。LSD法从最低位到最高位来对关键字进行处理,MSD法反之。

    以LSD法为例:

    1. 取得每个整数的个位数值(最低位)。
    2. 将所有整数按取得的个位数值进行分组,分组过程中,同组整数保持其在原队列里的顺序(保证了算法的稳定性)。
    3. 按每位数对队列进行重复分组,最终得到一个有序队列。

    算法实现

    package com.lygedi.sort;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class RadixSort {
        public void sort(int[] a){
            List[] bucket = new List[10];
            
            for(int i=0;i<10;i++){
            	List<Integer> al = new ArrayList<Integer>(); 
            	bucket[i] = al;
            }  
            
            int maxDigit = 1;
            int currentDigit = 1;
            int n = 1;
            
            while(currentDigit<=maxDigit){        	
                for(int i=0;i<a.length;i++){
                	int p = a[i];
                	if(currentDigit==1){
                		int temp = (int) Math.ceil(Math.log10(p));
                		if(temp>maxDigit){
                			maxDigit = temp;
                		}
                	}
    
                	int radix = (p / n) % 10;             	
                	bucket[radix].add(p);
                }
                
                int index = 0;
                for(int i=0;i<10;i++){
                	ArrayList<Integer> al = (ArrayList<Integer>) bucket[i];
                	for(int j=0;j<al.size();j++){
                		a[index] = (int) al.get(j);
                    	index++;
                	}
                	al.clear();
                }            
                 
                for(int i=0;i<a.length;i++){
                	 System.out.print(a[i]); 
                     System.out.print(","); 
                }
                System.out.println(currentDigit);
                
                currentDigit++;
                n *= 10;
            }          
        }
    	
    	public static void main(String[] args) {
    		int a[]={49,38,1,100,1000,1165,9,76,13,4127,49,8,34,10,12,649,49,56,200,412,762,98,97,100,55,
    				51,13,5,4,62,99,98999,54,56,179,17,18,11123,34,56,15,35,25,53,51,0,12013,732,999999,89,
    				853202,2342,3,20,1,201,1000,10000,100000,38,29,1234567,3,381,23,123,9123,1,2,12397,861};
    		
    		RadixSort qs = new RadixSort();
    		qs.sort(a);
    		
            System.out.println(a.length);
            for(int i=0;i<a.length;i++)  
                System.out.println(Integer.toString(i)+"-"+a[i]); 
    	}
    }
    
  • 相关阅读:
    DNN SEO专题 (收集)
    DataTable或者DataSet匯出Excel
    用C#制作PDF文件全攻略(转)
    BlogEngine资料收集
    DNN架构解析(收集)
    Community Server:快速找到需要修改的文件[技巧]
    通用的分页存储过程
    DataTable/DataSet汇出Excel
    百试不爽的30条职场经验(转)
    等宽字体
  • 原文地址:https://www.cnblogs.com/lygbzhu/p/5541280.html
Copyright © 2020-2023  润新知