Radix Sort

转自:http://www.2cto.com/kf/201211/166745.html

通俗理解:结合计数排序,通过对待排数组中元素每一位进行排序,最终达到对整个数组排序的效果。观看动态过程

[cpp] 
#include <stdio.h> 
#include <stdlib.h> 
#define MAXK 10 
int get_int(void); 
int count_sort (int*array,int n,int d); 
int get_value(int a,int d); 
void radix_sort(int* a,int n,int d); 
 
//测试 
int  
main() 

    int n = 12; 
    int p[12] = {1234,3123,2539,5958,4365,3352,6654,7214,7684,9351,4685,3325}; 
    radix_sort(p,n,3); 
    for (int i=0;i<n;i++) 
        printf("%d ",p[i]); 
    return 0; 

 
//基数排序 
void 
radix_sort(int* a,int n,int d) 

    for (int i=0;i<=d;i++) 
        count_sort(a,n,i); 

 
int  
count_sort (int *array, int n,int d)   
{   
    printf("%d\n",d); 
    int k[MAXK] = {0};   
    int * temp,*b;   
    int i;     
    temp = (int *) malloc (sizeof (int)*n);  
    b = (int *) malloc (sizeof (int)*n);     
    if (NULL == temp) 
        return 0 ; 
    for (i=0;i<n;i++) 
        b[i] = get_value(array[i],d); 
    //显示b数组 
    for (i=0;i<n;i++) 
        printf("%d ",b[i]); 
    printf("\n"); 
    for (i = 0; i < n; i++)  
        k[b[i]]++;//记录与数组下标相等的数值的个数 
    //显示k数组 
    for (i=0;i<10;i++) 
        printf("%d ",k[i]); 
    printf("\n"); 
    for (i=1;i<10;i++) 
        k[i]+=k[i-1];//储存自己数组下标数值在目标数组对应的位置 
    for (i=n-1;i>=0;i--)   
        temp[--k[b[i]]]=array[i]; //将原数组按大小顺序储存到另一个数组  
    //显示temp数组 
    for (i=0;i<n;i++) 
        printf("%d ",temp[i]); 
    printf("\n"); 
    for (i = 0; i < n; i++)   
        array[i] = temp[i];  
    free (temp); 
    free (b);    
   
    return 1 ;   

 
int  
get_value(int a,int d) 

    int b=a; 
    for (;d>0&&a>0;d--) 
        b/=MAXK; 
    return b%MAXK; 

int 
get_int(void) 

    int input; 
    char ch; 
    while (scanf("%d",&input)!=1) 
    { 
        while((ch=getchar())!='\n') 
            putchar(input); 
        printf(" is not an integer.\nPlease enter an integer value,such as 25,-178,or 3;\n"); 
    } 
    return input; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值