基数排序 java 实现
算法概念
基数排序(radix sort)是一种非比较型整数排序算法,不同于比较排序算法(例如:堆排序、归并排序、快速排序),它不需要比较关键字的大小,而是根据关键字中各位的值,通过对排序的N个关键字进行若干趟“分配”与“收集”来实现排序的。根据其原理,基数排序不仅适用于整数排序,还可以进行字符串(比如名字或日期)和特定格式的浮点数排序。基数排序是稳定性的排序,在某些时候,基数排序法的效率高于其它的比较性排序法。
算法思想
基数排序可以分为两类:最高位优先(Most Significant Digit first)法和最低位优先(Least Significant Digit first)法。LSD法从最低位到最高位来对关键字进行处理,MSD法反之。
以LSD法为例:
- 取得每个整数的个位数值(最低位)。
- 将所有整数按取得的个位数值进行分组,分组过程中,同组整数保持其在原队列里的顺序(保证了算法的稳定性)。
- 按每位数对队列进行重复分组,最终得到一个有序队列。
算法实现
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]);
}
}