思路:
基数排序是一种非比较排序,将整数按位数拆分不同的数字,先按照低位大小排序,然后收集;再按照高位排序,继续收集;依次类推,直到最高位。
基本步骤:
- 计算数组中最大元素,并计算最大元素的位数;
- 创建一个大小为10(如果考虑负整数,设为20)的数组作为桶,并创建一个和原始数组大小相同的数组作为收集中间过程元素的临时数组,并初始化桶和数组;
- 清空桶中元素,并对原始数组的每个元素,从低位开始取每个位并根据该位大小将该元素插入对应的桶中;
- 从大到小遍历原始数组,对于原始数组中的每个元素,根据在桶中的位置,插入到临时数组中;
- 最后将临时数组中的元素拷贝到原始数组中;
- 重复上面步骤3,4,5直到数组最大元素的最高位。
时间复杂度:
最好:;平均:
;最坏:
(其中n是数组元素的个数,k是桶的个数)
程序:
int get_max_digit(const int array[],int array_size)
{
int i,max_p,max_value,max_digit;
max_digit=0;
max_p=array_size-1;
for(i=0;i<array_size;i++)
{
if(array[i]>array[max_p])
max_p=i;
}
max_value=array[max_p];
if(max_value==0)
return 1;
for(max_digit=0;max_value!=0;max_value/=10)
{
max_digit++;
}
return max_digit;
}
void radix_sort(int array[],int array_size)
{
if(array_size<2)
return ;
int i,j,max_digit;
int mod=10;
int div=1;
int buckets[20]={0};
max_digit=get_max_digit(array,array_size);
int *tmp_array=calloc(array_size,sizeof(int));
if(tmp_array==NULL)
{
printf("No full space! \n");
return;
}
for(i=0;i<max_digit;i++)
{
//1. initialize the buckets
for(j=0;j<20;j++)
buckets[j]=0;
//2. put array elements in different buckets
for(j=0;j<array_size;j++)
buckets[(array[j]/div)%mod+mod]++;
//3. from start to end cumulative the buckets
for(j=1;j<20;j++)
buckets[j]+=buckets[j-1];
//4. from end to start put array elements in tmp_array
for(j=array_size-1;j>=0;j--)
tmp_array[--buckets[(array[j]/div)%mod+mod]]=array[j];
//5. copy the array elements to the original array
for(j=0;j<array_size;j++)
array[j]=tmp_array[j];
//6. increase the divisor
div*=mod;
}
free(tmp_array);
}
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i;
int array[]={100,96,88,75,63,52,41,36,28,96,19,6,0,-19,-105,28,52,52,52};
int array_size=sizeof(array)/sizeof(int);
printf("Original array:\n");
for(i=0;i<array_size;i++)
printf(" %d, ",array[i]);
printf("\n");
radix_sort(array,array_size);
printf("Sorted array:\n");
for(i=0;i<array_size;i++)
printf(" %d, ",array[i]);
printf("\n");
return 0;
}