算法描述
代码演示
class Radix{
public static void main(String[] args){
int arr[]={170,45,75,90,802,24,2,66};
int n=arr.length;
radixsort(arr,n);
print(arr,n);
}
//获取数组中的最大值
static int getMax(int arr[],int n){
int max=arr[0];
for(int i=1;i<n;i++){
if(arr[i]>mx)
max=arr[i];
}
return max;
}
//计数排序
static void countSort(int arr[],int n,int exp){
int output[]=new int[n];
int i;
int count[]=new int[10];
Arrays.fill(count,0);
//统计数组中元素第exp位的数目
for(i=0;i<n;i++){
count[(arr[i]/exp)%10]++;
}
//对count[]数组
for(i=1;i<10;i++){
count[i]+=count[i-1];
}
//进行计数排序
for(i=n-1;i>=0;i--){
output[count[(arr[i]/exp%10]-1]=arr[i];
count[(arr[i]/exp)%10]--;
}
//输出到数组arr[]中
for(i=0;i<n;i++){
arr[i]=output[i];
}
}
//基数排序
static void radixsort(int arr[],int n){
int m=getMax(arr,z);
//对数组中的数字按照每一位有效进行一趟计数排序
for(int exp=1;m/exp>0;exp*=10){
countSort(arr,n,exp);
}
}
}
复杂度分析
时间复杂度
- 最佳情况:T(n) = O(n * k)
- 最差情况:T(n) = O(n * k)
- 平均情况:T(n) = O(n * k)
基数排序有两种方法:
MSD 从高位开始进行排序 LSD 从低位开始进行排序
基数排序 vs 计数排序 vs 桶排序
这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:
- 基数排序:根据键值的每位数字来分配桶
- 计数排序:每个桶只存储单一键值
- 桶排序:每个桶存储一定范围的数值
空间复杂度
计数排序使用了额外的空间进行排序,空间复杂度为o(n)