#include <stdio.h>
#include <malloc.h>
#include <string.h>
void print(int dat[], int len)
{
int i;
for(i=0; i < len; i++)
if(dat[i]) printf("%4d ", dat[i]);
printf("\n");
}
void radix_sort(int a[], int len)
{
int *b = (int *)malloc(10*len*sizeof(int)); /*0~9十个桶,这里用一维数组代替二维数组*/;
int c[10] = {0};
int i, k, flag;
int divider = 1;
do
{
flag = 0;
memset(b, 0, 10*len*sizeof(int));
memset(c, 0, 10*sizeof(int));
for(i=0; i < len; i++) /*数据全部放入对应的桶中*/
{
k = a[i]/divider%10; /*计算当前的数应该放到哪个桶中*/
if(k) flag = 1; /*退出循环的条件是所有的数都放到第0个桶中*/
b[10*k + c[k]++] = a[i];
}
for(i=0, k=0; i < 10*len; i++) /*从桶中取出拍好一次序的数据*/
if(b[i]) a[k++] = b[i];
printf("中间值:");
print(a, len);
divider *= 10; /*按个位排完序之后按十位排,依次类推...*/
}while(flag);
free(b);
}
int main()
{
int a[] = {12, 40, 33, 4, 35, 58, 56, 21, 25, 781, 89, 32, 622};
printf("初始值:");
print(a, sizeof(a)/sizeof(int));
radix_sort(a, sizeof(a)/sizeof(int));
printf("排序后:");
print(a, sizeof(a)/sizeof(int));
return 0;
}程序运行结果截图:稳定性:稳定
基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是它只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,因此,它的使用同样也不多。而且,最重要的是,这样算法也需要较多的存储空间。另外,基数排序(桶排序)在处理多关键字,比如扑克排序(花色有大小,点数也有大小的情况)会使问题变得非常简单。
原文地址:http://blog.csdn.net/laoniu_c/article/details/38678481