排序6:基数排序
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序6:基数排序相关的知识,希望对你有一定的参考价值。
基数排序的方式可以采用最低位优先LSD(Least sgnificant digital)法或最高位优先 MSD(Most sgnificant digital)法,LSD的排序方式由键值的最右边开始,而MSD 则相反,由键值的最左边开始。我们这里使用LSD法,原理就是一个数组我们首先根据 他的个位进行排序,然后在根据十位,百位......,这里最多排到多少位是根据他的最大 值确定的,如果最大值有千位,我们必须要计算到千位,如果最多只有十位,我们就计 算到十位就可以了,每一位都排序完了之后,数组也就排序成功了,来看一下代码:
public static void radixSort(int[] array) {
int digitCount = 10;
int maxCount = getBitCount(getMaxNum(array));
int radix = 1;
int[][] tempArray = new int[digitCount][array.length];
for (int i = 0; i < maxCount; i++) {
int[] count = new int[digitCount];
for (int j = 0; j < array.length; j++) {
int temp = ((array[j] / radix) % 10);
tempArray[temp][count[temp]++] = array[j];
}
int index = 0;
for (int j = 0; j < digitCount; j++) {
if (count[j] == 0) {
continue;
}
for (int k = 0; k < count[j]; k++) {
array[index++] = tempArray[j][k];
}
}
radix *= 10;
}
}
public static int getBitCount(int num) {
int count = 1;
int temp = num / 10;
while (temp != 0) {
count++;
temp /= 10;
}
return count;
}
public static int getMaxNum(int array[]) {
int max = array[0];
for (int i = 1, lengh = array.length; i < lengh; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
写个测试方法吧:
int array2[] = {2, 16, 97, 13, 15, 11, 89, 7, 63, 21, 66, 8, 0};
radixSort(array2);
System.out.println(Arrays.toString(array2));
结果完全正确。
但是这个方法的问题是不能处理负数。
以上是关于排序6:基数排序的主要内容,如果未能解决你的问题,请参考以下文章