介绍
基数排序(Radix Sort)是一种非比较整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
具体步骤如下:
-
找到待排序数组中的最大数,确定需要进行多少次分配。
-
创建十个桶(对应0-9),每个桶内放置对应位数的数字。
-
从最低位开始,对每个位数进行分配,将数字放入对应的桶中。
-
将所有桶中的数字依次取出,放入原数组中。
-
重复步骤3和4,直到最高位。
代码实现
//基数
void radixSort(int* base, int len){
if(base==NULL||len<=1)
return;
//因为该排序方式只能排正整数,对此可以进行改进
//若该数组的最小值小于0,则将数组中所有元素同时加上最小值的绝对值
//这时,数组中所有元素均>=0
//待排序完成,再将所有元素同时减去原先的最小值的绝对值
//找出最大值和最小值
int value_min = base[0],value_max = base[0];
for(int i=1;i<len;i++){
if(base[i]<value_min)
value_min = base[i];
if(base[i]>value_max)
value_max = base[i];
}
//value_min<0,同加最小值的绝对值
if(value_min<0){
for(int i=0;i<len;i++)
base[i] -= value_min;
}
int value_max_cur = value_min<0?value_max-value_min:value_max;
//为桶开内存
int* buckets = (int*)malloc(sizeof(int)*len*10);
if(buckets==NULL)
return;
//每个桶中元素的数量
int num_data_bucket[10]={0};
//依次按照个、十、百...位将数据放入对应桶中
int k = 1;
while(value_max_cur/k>0){
for(int i=0;i<len;i++){
int index = (base[i]/k)%10;
*(buckets+index*len+num_data_bucket[index]++) = base[i];
}
//将桶中的数据依次取出
for(int i=0,index=0;i<10;i++)
for(int j=0;j<num_data_bucket[i];j++)
base[index++] = *(buckets+i*len+j);
//清空桶
memset(num_data_bucket,0,10*sizeof(int));
k*=10;
}
//value_min<0,排序完成,同减去最小值的绝对值
if(value_min<0){
for(int i=0;i<len;i++)
base[i] += value_min;
}
}
总结
时间复杂度:O(n+k),其中n为数字的平均位数,k为数字的个数。
空间复杂度:O(n*k)。