桶排序和基数排序(熟练掌握代码中结构体的使用trick)

来源:互联网 发布:淘宝网店怎么装修视频 编辑:程序博客网 时间:2024/05/29 19:26

1.桶排序

extern void quick_sort(int a[], int p, int q);/*桶的数目等于元素的数目,data数组的所有元素值均在[0,1)之间,所以进入桶的编号可由k = data[i] * n;来确定*/struct barrel {     //每个桶的结构(每个桶最多10个元素)    int node[10];       int count;};     void bucket_sort(int data[], int size)   {       int max, min, num, pos;       int i, j, k;       struct barrel *pBarrel;          num = n ;     //桶的个数        /*清空所有的桶*/    pBarrel = (struct barrel*)malloc(sizeof(struct barrel) * num);       memset(pBarrel, 0, sizeof(struct barrel) * num);         /* put data[i] into barrel which it belong to */      for (i = 0; i < size; i++) {           k = data[i] * n;        /* calculate the index of data[i] in barrel */          (pBarrel + k)->node[(pBarrel + k)->count] = data[i];           (pBarrel + k)->count++;       }              pos = 0;       for (i = 0; i < num; i++) {           quick_sort((pBarrel+i)->node, 0, (pBarrel+i)->count-1);/* sort node in every barrel */            for (j = 0; j < (pBarrel+i)->count; j++) {               data[pos++] = (pBarrel+i)->node[j];   //所有数已经入桶,所以不怕覆盖        }       }       free(pBarrel);   }     main()   {       int data[] = {78, 17, 39, 26, 72, 94, 21, 12, 23, 91}, i;        bucket_sort(data, int size = sizeof(data) / sizeof(int));         for (i = 0; i < size; i++)           printf("%d ", data[i]);   }  


2.基数排序

#define RADIX_10 10#define KEY_NUM 10struct radix{        int count;  //用于存储每个位子(0~9)上分配到的数字的个数         int *node;};   //这样的结构体总共有10个(每个数字每一位只可能是0~9中的一个) int GetNumInPos(int x, int pos){int tmp=1;for(int i=0;i<pos;i++)    tmp*=10;return (x/tmp)%10;}void  RadixSort(int *data ,int size){int pos;     //int m=0;    struct radix *pRadix=(struct radix*)malloc(sizeof(struct radix)*RADIX_10);memset(pRadix,0,sizeof(struct radix)*RADIX_10);for(int i=1;i<=KEY_NUM;i++){    for(int j=0;j<size;j++){        pos=GetNumInPos(data[j],i);        (pRadix+pos)->node[(pRadix+pos)->count]=data[j];         (pRadix+pos)->count++;    }     for(int i=0,m=0;i<RADIX_10;i++){     for(int k=0;k<(pRadix+i)->count;k++){     data[m++]=(pRadix+i)->node[k]; }       (pRadix+i)->count=0; //一定不要忘了清0 }} free(pRadix); }


参考资料:http://blog.csdn.net/cjf_iceking/article/details/7943609

                    http://blog.csdn.net/houapple/article/details/6480100

0 0
原创粉丝点击