这个是以10为基数的排序,不需要比较数组每一项的大小,在最坏的情况下,时间复杂度和快排一样。缺点是占用空间多一倍。在数值不大的情况下,效率比快排高。
public class BaseSort {
public static void main(String[] args) {
Random random=new Random();
int []a=new int[13];
for (int i=0;i<a.length;i++){
a[i]=Math.abs(random.nextInt(1001));
}
int maxSize=getMaxSize(a);
for (int i=0;i<maxSize;i++) {
sort(a, 13, (int) Math.pow(10,i));
}
for (int i=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
private static int getMaxSize(int[] a) {
int max=a[0];
for (int i=1;i<a.length;i++){
if (a[i]>max)
max=a[i];
}
int size=1;
while (max>=10){
max=max/10;
size++;
}
return size;
}
/**
*
* @param array 数组
* @param n 数组长度
* @param exp
*/
public static void sort(int[] array,int n,int exp){
int[] result=new int[n];
int[] buckets=new int[10];
// 0-9这十个槽位,分别记录的是该数字出现的次数
for (int i=0;i<n;i++){
buckets[(array[i]/exp)%10]++;
}
/*
目的是让 {0,0,3,0,0,7,0,0,0}
变成{0,0,3,3,3,10,10,10,10}
其实真正想要的是{0,0,3,0,0,10,0,0,0},
之所以变成上面的形式,是算法实现方便,不需要额外变量存储
*/
for (int i = 1; i < 10; i++)
buckets[i] += buckets[i - 1];
for (int i=n-1;i>=0;i--){
int temp=(array[i]/exp)%10;
result[buckets[temp]-1]=array[i];
buckets[temp]--;
}
for (int i=0;i<n;i++){
array[i]=result[i];
}
}
}