一、介绍
基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
二、实现步骤
- 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
- 然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。
基数排序的时间复杂度是O(k·n),其中n是排序元素个数,k是数字位数。注意这不是说这个时间复杂度一定优于O(n·log(n)),k的大小取决于数字位的选择(比如比特位数),和待排序数据所属数据类型的全集的大小;k决定了进行多少轮处理,而n是每轮处理的操作数目。
如果考虑和比较排序进行对照,基数排序的形式复杂度虽然不一定更小,但由于不进行比较,因此其基本操作的代价较小,而且在适当选择的B之下,k一般不大于logn,所以基数排序一般要快过基于比较的排序,比如快速排序。
三、代码实现
/**
* 基数排序,运用了计数排序的思想进行每轮的排序
* 前提:数据位正整数
*/
public class RadixSort {
public static void sort(int[] arr){
int digit = maxbit(arr);
int[] temp = new int[arr.length];
int[] count = new int[10];
int i, j, numberOfBucket;
int radix = 1;
for (i = 0; i <= digit; i++){
//清零计数器
for (j = 0; j < 10; j++)
count[j] = 0;
//统计每个桶的记录数
for (j = 0; j < arr.length; j++){
numberOfBucket = (arr[j] / radix) % 10;
count[numberOfBucket]++;
}
for (j = 1; j < count.length; j++)
count[j] += count[j - 1];
for (j = arr.length - 1; j >= 0; j--){
numberOfBucket = (arr[j] / radix) % 10;
temp[count[numberOfBucket] - 1] = arr[j];
count[numberOfBucket]--;
}
//将排序的中间结果拷贝到arr
for (j = 0; j < temp.length; j++)
arr[j] = temp[j];
radix *= 10;
}
}
private static int maxbit(int[] arr){
int maxData = arr[0];
//先求出最大数,再求其位数
for (int num : arr) {
if (num > maxData)
maxData = num;
}
int d = 0;
while(maxData != 0){
maxData /= 10;
d++;
}
return d;
}
}
三、参考资料
- 维基百科