您的位置:首页 > 编程语言

基数排序思想和代码

2016-04-21 16:02 441 查看
把每个数映射为一个结构体,添加一个位数值的属性,然后从最低位到最高位按此位的值对这组数排序。排序可使用计数排序(因为待排值都分布在很小的区间内)

此代码已A过 POJ2388

#include <stdio.h>

#define LENGTH 1000001
#define MAXNUM 10
int a[LENGTH];
int count[MAXNUM];

struct{
int digit;//key
int num;
}digit_num[LENGTH];

struct{
int digit;
int num;
}result[LENGTH];

void print(int* a,int x,int y){
int i;
for (i = x; i < y+1; i++)
printf("%d ",a[i]);
printf("\n");
}
void counting_sort(int n){
int i;
for(i = 0 ; i < MAXNUM;i++)
count[i] = 0;
for(i = 0 ; i < n;i++)
count[digit_num[i].digit]++;
for(i = 1 ; i < MAXNUM;i++)
count[i] += count[i-1];
for(i = 0 ; i < MAXNUM;i++)
count[i] --;
for(i = n-1 ; i >= 0;i--){
result[count[digit_num[i].digit]].num = digit_num[i].num;
count[digit_num[i].digit]--;
}
for(i = 0; i < n; i++)
digit_num[i].num = result[i].num;
}

int get_num_at_digit(int num,int d){
int mul,i,m;
mul = 1;
for(i = 1;i <= d; i++)
mul*=10;
m = num%mul/(mul/10);
return m;
}

void radix_sort(n){
int i,d;
d = 0;
for(i = 0; i < n ; i++){
int dd,num;
dd = 1;
num = a[i];
digit_num[i].num = num;
while(num/10 > 0){
num /= 10;
dd ++;
}
d = d > dd ? d : dd;
}

int j;
for(j = 1; j <= d; j++){
for(i = 0; i < n; i++)
digit_num[i].digit = get_num_at_digit(digit_num[i].num,j);
counting_sort(n);
}
}

int main(){
int n,i;

freopen("sort.in","r",stdin);
scanf("%d",&n);
for(i = 0 ; i < n ; i++)
scanf("%d",&a[i]);

radix_sort(n);

for(i = 0 ; i < n;i++)
printf("%d ",digit_num[i].num);
printf("\n");
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: