其实 ,只要理解了计数排序 ,对于基数排序也就驾轻就熟,因为基数排序就是运用计数排序的思想从待排元素的最低位开始不断调整,直到调整完最高位的数值。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int GetDigit(int n,int p)//取出整数n中第p位的数
{
int i = 0;
int t = 1;
for(i=0; i<p; i++)
t *= 10;
return (n/t)%10;
}
//num为位数的个数,k为所有位上的数的最大数加1
int rxsort(int *arr,int sz,int num,int k)
{
int *tmp = NULL;
int *count = NULL;
int i,j,n;
if(!(tmp=(int*)malloc(sz*sizeof(int)))) return 0;
if(!(count = (int*)malloc(k*sizeof(int)))) return 0;
for(j=0; j<num; j++)
{
for(i=0; i<k; i++)
count[i] = 0;
for(i=0; i<sz; i++)
{
n = GetDigit(arr[i],j);
count[n] = count[n] + 1;
}
for(i=1; i<k; i++)
{
count[i] = count[i]+count[i-1];
}
for(i=sz-1; i>=0; i--)
{
n = GetDigit(arr[i],j);
tmp[count[n] - 1] = arr[i];
count[n] = count[n]-1;
}
}
memcpy(arr,tmp,sz*sizeof(int));
free(tmp);
free(count);
return 1;
}
int main()
{
int i;
int arr[] = {324,16,728,162,666,233,250};
int sz = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<sz; i++)
printf("%d ",arr[i]);
rxsort(arr,sz,3,9);
printf("\n");
for(i=0; i<sz; i++)
printf("%d ",arr[i]);
return 0;
}
结果:
基数排序的时间复杂度是取决于它使用的稳定排序算法,在这里使用的是计数排序,所以这里它的时间复杂度是计数排序的n倍,其中n是位数的个数。
本文详细介绍了基数排序的工作原理及其实现过程,并通过具体的代码示例展示了如何利用计数排序的思想来实现基数排序。
3542

被折叠的 条评论
为什么被折叠?



