基数排序 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]); 
	}
}
posted @ 2016-05-30 09:06  朱博@连云港  阅读(206)  评论(0编辑  收藏  举报