基数排序思想和代码

来源:互联网 发布:js 扩展window对象 编辑:程序博客网 时间:2024/05/22 13:12

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

此代码已A过 POJ2388


#include <stdio.h>#define LENGTH 1000001#define MAXNUM 10int a[LENGTH];int count[MAXNUM];struct{int digit;//keyint 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;}


0 0