简要步骤
与计数排序一样,基数排序也属于分布类排序。它设定一些基数(也被称为“桶”),通过将待排数据分配至“桶”中进行排序。以整数为例,我们将基数设定为0~9,根据高低位遍历顺序的不同,基数排序分为最高位优先(MSD)和最低位优先(LSD),MSD适合大位数的数列排序,LSD则相反,本文采用的是LSD基数排序。
初始序列{0, 11, 51, 22, 74, 122, 341, 4, 71, 862}
性能分析
时间复杂度:O( d(N+r) ),d为位数,r为基数。
空间复杂度:对每一位上的数进行扫描时,都需要额外的N+r临时空间,所以空间复杂度为O( N+r ),r为基数。稳定性:不存在交换位置,所以排序稳定。
代码
#include <stdio.h>
#define RADIX_10 10 //整形共有10个位值,也就是10个基数,0~9
/*
* 获取num的第pos位的数
*/
int GetNumInPos(int num, int pos)
{
int temp = 1;
for (int i = 0; i < pos - 1; i++)
temp *= 10;
return (num / temp) % 10;
}
/*
* 获取待排序列arr中的最大值
*/
int GetMaxNum(int arr[], int length)
{
int i;
int maxnum = arr[0];
for(i = 0; i < length; i++)
if(maxnum < arr[i])
maxnum = arr[i];
return maxnum;
}
/*
* 获取数字num的位数
*/
int GetPos(int num)
{
int count = 1;
int temp = num / 10;
while(temp != 0)
{
count++;
temp /= 10;
}
return count;
}
/*
* 获取待排序列arr中的最大位数
*/
int GetMaxPos(int arr[], int length)
{
int maxnum = GetMaxNum(arr, length);
int maxpos = GetPos(maxnum);
return maxpos;
}
/*
* 基数排序
*/
void RadixSort(int arr[], int length)
{
if(arr == NULL || length <= 0)
{
printf("输入错误!");
return;
}
int maxpos = GetMaxPos(arr, length);
int radixarray[RADIX_10][10] = {};
for (int i = 0; i < RADIX_10; i++)
{
//每个桶的第一个元素记录该类数据的个数
radixarray[i][0] = 0;
}
for (int pos = 1; pos <= maxpos; pos++)
{
//入桶
for (int i = 0; i < length; i++)
{
int num = GetNumInPos(arr[i], pos);
++radixarray[num][0];
int index = radixarray[num][0];
radixarray[num][index] = arr[i];
}
//出桶
for (int i = 0, j =0; i < RADIX_10; i++)
{
for (int k = 1; k <= radixarray[i][0]; k++)
arr[j++] = radixarray[i][k];
radixarray[i][0] = 0;
}
}
}
int main()
{
int arr[] = {0,11,51,22,74,122,341,4,71,862};
int length = sizeof(arr)/sizeof(arr[0]);
printf("排序前:");
for(int i=0; i<length; i++)
{
printf(" %d",arr[i]);
}
RadixSort(arr, length);
printf("\n排序后:");
for(int i=0; i<length; i++)
{
printf(" %d",arr[i]);
}
return 0;
}