69,371
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define d 6
#define radix 10
////////////////////////////////////////////////////////////////////////////////////////////////
int getdigit(int x,int y){
int a[]={1,1,10,100,1e3,1e4,1e5,1e6,1e7,1e8,1e9}; ////应为待排数据最大数据位数
return (((int)x/a[y])%10);
}
void msdradix_sort(int arr[],int begin,int end,int w,int in)
{
int i,j;
int count[radix]; //count表示每个桶中元素个数
int *bucket=(int *)malloc((end-begin+1)*sizeof(int));
//统计各桶需要装的元素的个数
for(i=0;i<10;++i)count[i]=0;
for(i=begin;i<=end;++i){
count[getdigit(arr[i], w)]++;
}
//求出桶的边界索引,count[i]值为第i个桶的右边界索引+1
for(i=1;i<radix;++i){
count[i]+=count[i-1];
}
for(i=end;i>=begin;--i)
{
j=getdigit(arr[i],w); //求出关键码的第d位的数字, 例如:576的第3位是5
bucket[count[j]-1]=arr[i]; //放入对应的桶中,count[j]-1是第j个桶的右边界索引
--count[j]; //第j个桶放下一个元素的位置(左边界索引+1)
}
//从各个桶中收集数据
for(i = begin, j = 0;i <=end; ++i, ++j)
{
arr[i] = bucket[j];
}
//释放存储空间
free(bucket);
for(i=0;i<radix-1;++i)
{
if (in>count[i]&&in<count[i+1]&&w>3)
{
int p1=begin+count[i]; //第I个桶的左边界
int p2=begin+count[i+1]-1;
msdradix_sort(arr,p1, p2, w-1,in-count[i]);
}
}
}
void main ()
{
int i;
int arr[10]={0};
int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};
msdradix_sort(crr,0,9,6,1);
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
printf("\n");
}
}
void main ()
{
int i;
int arr[10]={0};
int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};
msdradix_sort(crr,0,9,6,1);
for(i=0;i<10;i++)
{
printf("%d",crr[i]); //这里换成打印crr,你就能理解我说的是什么意思了
printf("\n");
}
}
void main ()
{
int i;
int arr[10]={0};
int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};
memcpy(arr, crr, sizeof(crr)); //把crr复制给arr
msdradix_sort(arr,0,9,6,1); //直接用arr作为参数,因为排序结果就保存在arr里
for(i=0;i<10;i++)
{
printf("%d",arr[i]);
printf("\n");
}
}