#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