8. 基数排序
思想
基数排序,是按照元素的更小元素组成来进行排序。拿常用的数字排序举例,会先对个位进行排序,然后对十位进行排序。
其中,关键是如何对个位进行排序,如何对十位进行排序。
我们知道对于数字的每一位,只有10个数字(0-9),这就是基数。所以故名,基数排序。基数排序所以可以理解为适用于基数是有限的情况下。
所以基数排序中的基数,相当于把计数排序中的计数数组的大小确定下来了。
那么如何对个位、十位进行排序呢?可以用到计数排序。
实现
import java.util.Arrays;
public class RadixSort {
public static void main(String[] args) {
int[] array = { 1200, 292, 121, 72, 233, 44, 12 };
radixSort(array, 10, 4);
System.out.println(Arrays.toString(array));
}
public static void radixSort(int[] array, int radix, int d){
int[] tempArray = new int[array.length];
int[] count = new int[radix];
int rate = 1;
for (int i = 0; i < d; i++) {
Arrays.fill(count, 0);
System.arraycopy(array, 0, tempArray, 0, array.length);
for (int j = 0; j < array.length; j++) {
int subKey = (tempArray[j] / rate) % radix;
count[subKey]++;
}
for (int j = 1; j < radix; j++) {
count[j] = count[j] + count[j - 1];
}
for (int m = array.length - 1; m >= 0; m--) {
int subKey = (tempArray[m] / rate) % radix;
array[--count[subKey]] = tempArray[m];
}
rate *= radix;//前进一位
}
}
}
复杂度
实现思路就是对每个位进行计数排序,所以时间复杂度为未排序数据中的最长位数乘以计数排序的时间复杂度。
空间复杂度为基数大小。
可以看到,基数排序解决了计数排序中的数据最大最小值间隔问题,允许数值相差较大的数字进行排序。