基数排序:基数排序(Radix Sort)是桶排序的扩展,它的基本思想是:将整数按位数切割成不同的数字,然后按每个位数分别比较。
实现思想:将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从最低位开始,依次进行一次排序。这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
代码实现:
package sort;
/**
*
* @ClassName: CountSort
* @Description: TODO 基数排序
* @author: HRX
* @date: 2018年12月18日 下午5:17:05
*/
public class CountSort extends Sort{
public static void sort(int[] num , int n){
int[] n1 = new int[10];
int[] temp = new int[num.length];
for(int i = 0; i < num.length; i++)
n1[(num[i]/n)%10]++;
for(int i = 1; i < n1.length; i++)
n1[i] += n1[i-1];
for(int i = num.length - 1; i > 0; i--){ //特别注意 这里一定要到序,目的是为了防止两个数取余后相同,下一步会执行减一操作,大的肯定会在后边
temp[n1[(num[i]/n)%10] - 1] = num[i];
n1[(num[i]/n)%10]--;
}
for(int i = 0; i < num.length; i++)
num[i] = temp[i];
}
public static int getMax(int[] num){
int b = 0;
for(int i : num)
if(i > b)
b = i;
return b;
}
public static void main(String[] args) {
int[] num = { 50, 30, 542, 745, 2014, 154, 300000, 616};
for (int i = 1; getMax(num)/i > 0; i *= 10)
sort(num, i);
printArray(num);
}
}
时间复杂度:
对于给定的n个d位数,取值范围为[0,k],我们使用计数排序比较元素的每一位,基数排序耗时Θ(n+k),那么基数排序的复杂度为Θ(d(n+k))。
我们还是和快速排序进行比较,仅仅从渐进性来看,基数排序比快速排序要好,但是隐藏在O符号后面的常数项因子是不同的,基数排序循环次数比快速排序循环次数少,但是基数排序每次循环会比快速排序长。更多的时候我们使用哪一种是通过输入数据的特征以及主存容量是否宝贵来决定的。当我们需要原址排序或者主存容量宝贵的时候我们就更倾向于快速排序这样的原址排序。