基数排序(radix sort)

2017-09-11  本文已影响0人  lpworkstudy

基数排序思想

如果我们有N个整数,范围从1M(或从1M - 1),我们可以利用这个信息得到一种快速的排序,叫做桶式排序(bucket sort)。我们留置一个数组,称之为Count,大小为M,并初始化为0。于是,Count有M个单元,开始时他们都是空的。当A[i]被读入时Count[A[i]]增1。在所有的输入被读进后,扫描数组Count,打印输出排好的表。

代码实现(C语言)

LMD(最低位优先法)

#include<stdio.h>
#include<math.h>

int main(void)
{
    int a [] = {3,15,18,10,34,20,13,20,100,254,486,598 };
    int * p = a;
    //计算数组长度
    int size = sizeof(a) / sizeof(int);
    //基数排序
    bucketSort3(p,size);
    //打印排序结果
    int i;
    for(i = 0; i < size; i++)
        printf("%d\n",a[i]);

    return 0;
}


//基数排序
void bucketSort3(int * p, int n)
{
    //获取数组中的最大数
    int maxNum = findMax(p,n);
    //获取分配次数
    int times = getTimes(maxNum);
    int i;
    printf("times:%d\n",times);
    for(i = 1; i <= times; i++)
        sort2(p,n,i);
}

int getTimes(int num)
{
    int count = 1;
    int temp = num / 10;
    while(temp != 0)
    {
        count++;
        temp= temp / 10;
    }

    return count;
}

int findMax(int * p,int n)
{
    int i;
    int max = 0;

    for(i = 0;i < n; i++)
    {
        if (p[i] > max)
            max = p[i];
    }
    return max;
}

//将数字按位数分配到各自的桶中,按桶的顺序输出排序结果

void sort2(int * p,int n, int loop)
{
    // 预设桶的大小
    int buckets[10][20] = {};
    int tempNum = (int)pow(10,loop - 1);
    int i,j;

    for(i = 0; i < n; i++ )
    {
        int index = (p[i] / tempNum) % 10;
        for(j = 0; j < 20; j++)
         {
             if(buckets[index][j] == NULL)
        {
            buckets[index][j] = p[i];
            break;
        }
         }

    }

    //将桶中的数,倒回到原有数组中

    int k = 0;

    for (i = 0; i < 10; i++)
    {
        for (j = 0; j < 20; j++)
        {
            if (buckets[i][j] != NULL)
            {
                p[k] = buckets[i][j];
                buckets[i][j] = NULL;
                k++;
            }


        }
    }
}

测试结果

image.png
上一篇下一篇

猜你喜欢

热点阅读