package algorithm.sort;
import utils.com.ArrayLister;
/**
* 基数排序 O(n)
* 从个位到十位:影响因子
* @author Toy
*
*/
public class RadixSort {
/**
* @param a
* @param dnum: 待排位数的个数
* @return
*/
public int[] radix(int[] a,int dnum){
int n=a.length;
int[] tempArr=new int[n];
//计数排序,记录当前位的各数值
int[] countArr=new int[10];
for(int d=1;d<=dnum;d++){
System.out.println("d: "+d);
//初始化
for(int i=0;i<countArr.length;i++){
countArr[i]=0;
}
for(int i=0;i<tempArr.length;i++){
tempArr[i]=0;
}
//计算计数数组
for(int i=0;i<n;i++){
int digital=(a[i]/(int)Math.pow(10, d-1))%10;
countArr[digital]=countArr[digital]+1;
}
for(int i=1;i<countArr.length;i++){
countArr[i]=countArr[i]+countArr[i-1];
}
//排序
for(int i=n-1;i>=0;i--){
int digital=(a[i]/(int)Math.pow(10, d-1))%10;
tempArr[countArr[digital]-1]=a[i];
countArr[digital]=countArr[digital]-1;
}
//复制数组
for(int i=0;i<n;i++){
a[i]=tempArr[i];
}
}
return a;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a=new int[]{451,12,451,2,31,5,9881};
RadixSort s=new RadixSort();
ArrayLister.showArr(a);
a=s.radix(a, 4);
ArrayLister.showArr(a);
}
}
基数排序
最新推荐文章于 2011-09-08 18:23:22 发布