目录
算法思想
用辅助数组对数组中出现的数据计数,元素转下标
即array[0]=100,helper[100]++;
代码实现
private static void countSort(int[] array) {
//找到绝对值最大的那个数
int max = maxOf(array);
//从0到max-1存放负数,max存放0,从max+1到size存放正数
int size = ((max+1)<<1)-1;
int[] helper = new int[size];
for(int i=0; i<array.length; i++) {
helper[max+array[i]]++;
}
//将数据回填
int current=0;//数据回填的位置
for(int i=0; i<helper.length; i++) {
if(helper[i] > 0) {
while(helper[i] > 0) {
array[current++] = i-max;
helper[i]--;
}
}
}
}
private static int maxOf(int[] array) {
int num = 0;
for(int i=0; i<array.length; i++) {
if(array[i] >= 0 && array[i] > num) {
num = array[i];
}
else if(array[i] < 0 && array[i]*(-1) > num) {
num = (-1)*array[i];
}
}
return num;
}
时间复杂度
时间复杂度为,n为数组长度,k为数组最大值。以空间换时间。