C中的慢基数排序

时间:2016-09-27 18:03:43

标签: c sorting radix

我必须按升序对数组中的数字进行排序,我的时间复杂度必须为O(n)。我使用基数排序,但速度不够快。任何想法如何让我的代码更快?这是:

void radix(int *a, int n) { 

    int i;
    int sorted[n];
    int number = 1;
    int biggestNumber = -1;

 for(i = 0; i < n; i++){
     if(a[i] > biggestNumber)
        biggestNumber = a[i]; }


while (biggestNumber / number > 0){

 int bucket[10] = { 0 };

    for (i = 0; i < n; i++)
      bucket[(a[i] / number) % 10]++;

    for (i = 1; i < 10; i++)
      bucket[i] += bucket[i - 1];

    for (i = n - 1; i >= 0; i--)
      sorted[--bucket[(a[i] / number) % 10]] = a[i];


   for (i = 0; i < n; i++)
      a[i] = sorted[i];

      number*= 10; } }

1 个答案:

答案 0 :(得分:1)

注释 - 排序似乎仅适用于正数,如果[i]为负数,则负数索引用于存储桶[...]并排序[...]。如果不需要有符号整数,则可以更改此选项以对无符号整数进行排序。没有检查数字溢出* = 10.已从堆栈中分配已排序,如果n很大则无法工作。使用malloc()为已排序的空间分配空间。

使排序更快:

将基数的基数从10改为256.为避免可能的溢出,检查0 ==(数字* = 256)以摆脱循环。

在每次通过时替换基数排序的方向。第一次传递从排序到下一次传递从排序到a。这是最简单的使用一对指针,在每次传递时交换,然后在排序完成后,检查排序的数据是否以[]结束,如果不是,则从sorted []复制到[]。< / p>

将存储桶设为矩阵。假设int是32位,而base是256,那么bucket将是[4] [256]。这允许在[]上单次传递以创建桶矩阵。如果int是64位,则桶为[8] [256]。