基数排序
我们知道基数排序和计数排序都是桶排序的扩展,基数排序的时间复杂度能够突破O(nlogn),达到O(n),是一种与基于比较排序不同的排序算法。
思路:从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列,所以我们需要找到位数最多的数来判断我们需要进行多少次,最多位的数可以等价于找到最大的数。
public static void radixSort(int[] array) {
//先找出最大的数
int max = 0;
for(int m = 0; m < array.length; m++) {
if(array[m] > max) {
max = array[m];
}
}
for(int n = 0; n < String.valueOf(max).length(); n++) {
//建立桶
int[][] bucket = new int[array.length][10];
//记录每个桶中的个数
int[] count = new int[10];
//从低位到高位按顺序放入桶中
for(int i : array) {
//依次比较个位、10位...
int j = (int) ((i / Math.pow(10, n)) % 10);
bucket[count[j]][j] = i;
count[j]++;
}
//依次将桶中的数据放入原数组
int index = 0;
//先保持一个桶不变,按顺序放入原数组
for(int i = 0; i < 10; i++) {
for(int j = 0; j < count[i]; j++) {
array[index++] = bucket[j][i];
}
//每一轮都要清除每个桶中的个数达到重复利用
count[i] = 0;
}
}
}
我们可以看出基数排序也有它的局限性,就是只能对整数进行排序