平日所见的基数排序基本都是讲正整数的,没有讲到负数的,所以今天写一个可解决负数情况的基数排序。
首先,我们可以加上某个值,使得数组中肯定不会出现负数,然后这样我们就可以按照以前基数排序的套路进行排序了。
因为基数排序需要找到最大值,所以我们可以在寻找最大值的同时也寻找最小值。废话不多说,上代码。
public int[] radixSort(int[] arr){
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int i = 0; i < arr.length; i++) {
max = Math.max(max, arr[i]);
min = Math.min(min, arr[i]);
}
if (min<0) { //如果最小值小于0,那么把每个数都减去最小值,这样可以保证最小的数是0
for (int i = 0; i < arr.length; i++) {
arr[i] -= min;
}
max -= min; //!max也要处理!
}
int maxLength = (max+"").length();
int[][] bucket = new int[10][arr.length];
int[] bucketElementCount = new int[10];
for (int i = 0 ,n = 1 ; i < maxLength ; i++,n*=10) {
for (int j = 0; j < arr.length ; j++) {
int value = arr[j]/n % 10;
bucket[value][bucketElementCount[value]] = arr[j];
bucketElementCount[value]++;
}
int index = 0;
for (int j = 0; j < bucketElementCount.length ; j++) {
if (bucketElementCount[j]!=0){
for (int k = 0; k < bucketElementCount[j]; k++) {
arr[index] = bucket[j][k];
index++;
}
}
bucketElementCount[j] = 0;
}
}
if (min<0){
for (int i = 0; i < arr.length ; i++) {
arr[i] += min;
}
}
return arr;
}
503

被折叠的 条评论
为什么被折叠?



