基数排序

本来应该是上午应该更新的。。但是我们的csdn太忙,登录半天就是登录不上,所以,直到现在才更新。。闲话少说,还是正事为主。。

基数排序是古老打表的一种,是桶排序的特殊情况,在基数排序中,我们用到了计数排序的相关的知识,那么还是先说一下基数排序的大体思路,按我的理解,就是排序就是从个位数依次至最高位,根据各个位数上的大小不同分别排序,直至根据最高位上的各个数字的不同排序后,就是我们所得到的排序好的顺序,算法的重要性是按位排序要稳定,关于按位排序我们可以利用字符串的二维数组,或者采用我下边代码的计数排序,但是我下边代码的确定就是,我们数字各个位数的最大数字必须小于等于数字总数,或者总个数大于10,至于为什么,我想还是仔细我下边的计数排序的那个缺点之处,有改进的方法吗,当然,我们只需将下边的计数排序的代码进行修改,这个我再日后会尽量完善,因为我只想谈一下基数排序的思路,而不是完全的代码,下边的代码则足以表现基数排序的思路。。

 

C语言: Codee#12927
//题目:基数排序
//by 笨牛dashan
//完成时间: 2010.8
//完成状况:已完成。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int n;
void padix_sort( int * a , int d)
{
    int temp [ MAX ][ MAX ] = { 0 };
    int order [ MAX ] = { 0 };
    int i , j , lst;
    int x = 1 , m = 1;
    for( i = 1; i < d; i ++)
    {
        x *= 10;
    }
    while( m <= x)
    {
        int k = 0;
        for( i = 0; i <n; i ++)
        {
            lst =( a [ i ] / m) % 10;
            temp [ lst ][ order [ lst ]] = a [ i ]; //采用计数的方法存储
            order [ lst ] ++;
        }
        for( i = 0; i <n; i ++)
        {
            if( order [ i ] != 0)
            {
                for( j = 0; j < order [ i ]; j ++ , k ++)
                {
                    a [ k ] = temp [ i ][ j ];
                }
            }
            order [ i ] = 0;
        }
        k = 0;
        m *= 10;
    }
   
}
int main()
{
    int a [ 100 ]; //定义一个数组用于存储数字
    while( printf( "几个数啊?? /n " ), scanf( "%d" , &n))
    {
        int d;
        int i;
        printf( "多少位啊?? /n ");
        scanf( "%d" , & d);
        printf( "都是啥啊?? /n ");
        for( i = 0; i <n; i ++)
        {
            scanf( "%d" , & a [ i ]);
        }
        printf( "排序之前是: /n ");
        for( i = 0; i <n; i ++)
        {
            printf( "%d " , a [ i ]);
        }
        printf( " /n ");
        padix_sort( a , d);
        printf( "排序之后是: /n ");
        for( i = 0; i <n; i ++)
        {
            printf( "%d " , a [ i ]);
        }
        putchar( '/n');
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值