基数排序

来源:互联网 发布:3d房屋设计软件 编辑:程序博客网 时间:2024/06/04 20:12
#include<math.h>testBS(){inta[]={2,343,342,1,123,43,4343,433,687,654,3};int*a_p=a;//计算数组长度intsize=sizeof(a)/sizeof(int);//基数排序bucketSort3(a_p,size);//打印排序后结果inti;for(i=0;i<size;i++){printf("%d\n",a[i]);}intt;scanf("%d",t);}//基数排序voidbucketSort3(int*p,intn){//获取数组中的最大数intmaxNum=findMaxNum(p,n);//获取最大数的位数,次数也是再分配的次数。intloopTimes=getLoopTimes(maxNum);inti;//对每一位进行桶分配for(i=1;i<=loopTimes;i++){sort2(p,n,i);}}//获取数字的位数intgetLoopTimes(intnum){intcount=1;inttemp=num/10;while(temp!=0){count++;temp=temp/10;}returncount;}//查询数组中的最大数intfindMaxNum(int*p,intn){inti;intmax=0;for(i=0;i<n;i++){if(*(p+i)>max){max=*(p+i);}}returnmax;}//将数字分配到各自的桶中,然后按照桶的顺序输出排序结果voidsort2(int*p,intn,intloop){//建立一组桶此处的20是预设的根据实际数情况修改intbuckets[10][20]={};//求桶的index的除数//如798个位桶index=(798/1)%10=8//十位桶index=(798/10)%10=9//百位桶index=(798/100)%10=7//tempNum为上式中的1、10、100inttempNum=(int)pow(10,loop-1);inti,j;for(i=0;i<n;i++){introw_index=(*(p+i)/tempNum)%10;for(j=0;j<20;j++){if(buckets[row_index][j]==NULL){buckets[row_index][j]=*(p+i);break;}}}//将桶中的数,倒回到原有数组中intk=0;for(i=0;i<10;i++){for(j=0;j<20;j++){if(buckets[i][j]!=NULL){*(p+k)=buckets[i][j];buckets[i][j]=NULL;k++;}}}}

0 0
原创粉丝点击