您的位置:首页 > 其它

基数排序!一种美妙实用高效的排序算法!

2013-12-24 23:02 246 查看
不用递归也能实现像递归那样的高速度排序!而你所要排序的数组的元素值在一个差不多是连续序列时就可以考虑用基数排序,如果对这个算法不清楚的人可以百度一下或者到《算法导论》查看一下相关内容。下面来看一下实例,如果要逆序输出,只要在输出时从末尾开始输出即可不需要改动基数排序的代码。

/*
欲详知本程序,请阅读《算法导论》中关于基数排序的章节?
*/

#include "stdio.h"
#include "conio.h"
#include "math.h"
#define true 1
#define false 0
#define N  10   //N代表数组长度,C语言没有length属性,只能人为地宏定义一个参数?
void radix_sort(int A[],int d)  //d表示数组A元素的每个元素一共由d位组成
{
    int i=1,j,B[N+1];

    for(i=1;i<=d;i++)
    {
       count_sort(A,B,9,i);
       for(j=1;j<=N;j++)
       {
            A[j]=B[j];
       }
    }
    return ;
}
int  count_sort(int A[],int B[],int k,int d) //k为输入数组的最大值
{
    int i,j=(int)pow(10,(d-1));
    int C[10],temp[N+1];  //这里不能用k表示长度,因为C语言不允许定义时用变量作为数组长度
    for(i=0;i<=k;i++)
    {
        C[i]=0;
    }
    for(i=1;i<=N;i++)
    {   //这个是利用了C语言整数相除只留整数部分的原理?
        temp[i]=(int)((A[i]/j*j-A[i]/(j*10)*(j*10)) / j ) ;
    }
    for(i=1;i<=N;i++)
    {
        C[temp[i]]=C[temp[i]]+1;
    }
    for(i=1;i<=k;i++)
    {
       C[i]=C[i-1]+C[i];
    }
    for(i=1;i<=N;i++)
    {
       B[C[temp[i]]]=A[i];
       C[temp[i]]--;
    }
    return 1;
}

main()
{
    /*0号元素不参加排序Wⅰ注意turbo c下有符号整形数的数值范围是-32768~32767
    无符号整形数的范围是0~65536 */
    int a[N+1]={0,329,457,657,839,436,720,355,210,531,123},i,b[N+1];
    radix_sort(a,3); //表示待排序的数组元素是3位元素
    //printf("\nthe result is nextline ,please think it quickly\n");
    for(i=1;i<=N;i++)
    {
        printf("\na[%d]=%d ",i,a[i]);
    }
    getch();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: