c - 快速排序效果不佳

标签 c algorithm quicksort

我曾尝试使用一本书中的伪代码(看起来像维基百科中的伪代码)来实现快速排序,但我无法让它工作。

此源代码:

int partitionare(int a[], int n, int p, int r)
{
   int x, i, j, aux;
   x = a[r]; // pivot
   i = p - 1;
   for (j = p; j < r; j++)
   {
       if (a[j] <= x)
       {
           i++;
           aux = a[j];
           a[j] = a[i];
           a[i] = aux;
        }   
   }
   aux = a[i + 1];
   a[i + 1] = a[r];
   a[r] = aux;
   return i + 1;
}
void quicksort(int a[], int n, int p, int r)
{
    if (p < r)
    {
       int q = partitionare(a, n, p, r);
       partitionare(a, n, p, q - 1);
       partitionare(a, n, q + 1, r);
    }
}

其中 p 和 r 是数组的开头和结尾

调用函数:

quicksort(a, n, 0, n-1);

不要介意第二个参数 n。这仅用于测试目的。

最佳答案

根据Wikipedia article函数 quicksort() 中的最后一次调用是递归地调用自身(而不是函数 partition())

void quicksort(int a[], int n, int p, int r)
{
    if (p < r)
    {
       int q = partitionare(a, n, p, r);
       partitionare(a, n, p, q - 1);     /* recursive quicksort() here */
       partitionare(a, n, q + 1, r);     /* recursive quicksort() here */
    }
}

关于c - 快速排序效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36113726/

相关文章:

c - 如果指向标准输入,是什么让 fgets() 实际上等待用户输入?

c - 通过元素复制分配没有元素的数组?

algorithm - 如何有效地将整数转换为斐波那契编码?

algorithm - 关于快速排序 killer

C - 为什么只有第二个命令有效?

c - 为什么这会导致核心转储?

algorithm - 成对异或的或

algorithm - "RaceTrack"游戏的AI算法

使用第二个元素作为基准的 Prolog 快速排序

c++ - 为什么按降序排序与升序排序时快速排序需要更长的时间