基数排序

来源:互联网 发布:java导出图片 编辑:程序博客网 时间:2024/04/30 04:14

本来应该是上午应该更新的。。但是我们的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');
    }
}