/**
* 基数排序(低位优先算法) 基于计数排序
*
* 时间复杂度为O(d*(n+max)),较快排速度更快。但需要额外内存,所以是非原地排序。如果内存吃紧,还是采用快排比较适合
*/
@Test
public void radixSort(){
String[] dates={"20150121","20130122","20150215","20140922","20140625","20150911","20140625"};
//基数排序--8表示元素的位数
//采用低位优先很简单,就是逐位排序,不过需要依赖于每个位上的排序操作的稳定性,并且待排序的数组中每个元素的位数都需要保持一致
//目前排序日期,每个日期都是8位字符串
radixSort(dates,8);
//以换行的方式打印数组中各个元素
printlnArray(dates);
}
private void radixSort(String[] dates,int d) {
int R=255;
String[] copy=new String[dates.length];
for(int i=d-1;i>=0;i--){
//采用稳定的计数排序
int[] c=new int[R+1];
//计数
for(int j=0;j<dates.length;j++){
c[dates[j].charAt(i)]++;
}
//记录每个元素所应该在的位置
for(int j=1;j<R;j++){
c[j]+=c[j-1];
}
//将记录在c数组中的元素插入到 copy(辅助数组)的合适位置
for(int j=dates.length-1;j>=0;j--){
copy[--c[dates[j].charAt(i)]]=dates[j];
}
//将辅助数组的值拷贝会原始数组
for(int j=0;j<dates.length;j++){
dates[j]=copy[j];
}
}
}
/**
* 以换行的方式打印数组中各个元素
*/
public void printlnArray(Object[] obj){
for(Object o:obj){
System.out.println(o);
}
}