经典排序——基数排序LSD——C语言版

来源:互联网 发布:openstack 源码分析 编辑:程序博客网 时间:2024/05/17 07:44
/*基数排序——LSD*//*一共10个桶,从个位开始,将元素按照每一位的数字分配到相应桶中,然后再重新收集,每次收集后,元素之间保持了相对位置(个位小的在前,经过重新分配后,依然保持个位小的在前)最后一次收集后元素将从小到大依次排列*/#include <stdio.h>#define digit 4 //几位数字,随便设置#define bucket_size 10 //每个桶的容量/*选取数字函数*/int number(int s,int i){    int k = 0,p;    int cs;    p=s;    for(cs=0;cs<=i;cs++)    {        k=p%10;        p=(p-k)/10;    }//printf("%d\n",k);    return k;}int LSD_sort(int s[],int length){    int i,j,num,p,k;    int bucket[10][bucket_size];    /*向桶中插入元素,从低位向高位*/    for(i=0;i<digit;i++)    {        p=0;        int bucket_num[10]={0,0,0,0,0,0,0,0,0,0}; //记录每个桶里插入了多少元素        /*第一次为创建空桶,以后每次将桶清空*/        for (k=0;k<10;k++)        {            for (j=0;j<bucket_size;j++)            {                bucket[k][j]=0;            }        }        for(j=0;j<length;j++)        {            num=number(s[j],i);//选取数字            bucket[num][bucket_num[num]]=s[j];//将元素插入桶中            bucket_num[num]++;//相应桶的下一个位置        }        /*重新收集元素*/        for (j=0;j<10;j++)        {            int t=0;            while(bucket_num[j]!=0)            {                s[p]=bucket[j][t];                t++;                p++;                bucket_num[j]--;            }        }    }    return *s;}
0 0
原创粉丝点击