算法分析之——基数排序

基数排序

基数排序(radix-sort),首先是按照最低有效位数字进行排序,然后再按次低有效位,知道对所有的数字都进行排序。对于d位数来说,仅需d遍就可以将一个数组排好序。

下图给出形象的排序过程:红色表示当前正被排序的数位。

算法分析之——基数排序_第1张图片

对于基数排序,重要的一点就是按位排序要稳定。因此,在这一步,我们可以选择稳定的排序算法。如:计数排序、插入排序、归并排序都可以。

接下来给出基数排序的算法实现过程:

void radix_sort(int A[],int B[],int length,int d)
{
    int i;
    for (i=1;i<=d;i++)
    {
        get_k(A,B,i,length,d);
        insert_sort(B,A,length);
        printf("\n\n第%d位排序完成的结果:\n\n",i);
        print_A(A,length);
    }   
}

A是待排序数组,B用来存储数组A中第i位的数字,length是数组A的长度,d代表数字的长度。

void get_k(int A[],int B[],int i,int length,int d)//获得数组A第i位的数字;
{
    int k,x_,j;
    for (k=0;k<length;k++)
    {
        x_ = A[k];
        for (j=d;j>i;j--)
        {
            x_ = x_ - ((x_ / (int)pow(10,j-1)))*(int)pow(10,j-1);
        }
        B[k] = x_ / (int)pow(10,i-1);
    }



}

void get_k(int A[],int B[],int i,int length,int d)获得数组A第i位的数字;然后进行排序,排序算法选择插入排序算法。

void insert_sort(int B[],int A[],int length)
{
    int i,j,key,key1;
    for(j=1;j<length;j++) //执行n次
    {
        key = B[j];   //n-1次
        key1 = A[j];
        i = j-1;
        while(i>=0 && B[i]>key) 
        {
            B[i+1] = B[i];
            A[i+1] = A[i];

            i = i-1;
        }
        B[i+1] = key;
        A[i+1] = key1;

    }
}

基数排序的运行结果:
算法分析之——基数排序_第2张图片
算法分析之——基数排序_第3张图片

源代码:基数排序算法实现

你可能感兴趣的:(算法分析之——基数排序)