为什么这个快速例程不起作用?

时间:2014-06-04 11:38:15

标签: c quicksort

我试图用它来对随机生成的数字进行排序,所以我打印随机数,应用快速排序然后打印排序列表,但它只是再次以相同的顺序给我数字。

  void quicksort(double x[], int first, int last)
  {

    int i=first;
    int j=last;
    if((j-i)<2)
    {return;}
    else
    {
        double pivot;
        pivot=x[(i+j)/2];
        if(i<j)
        {
            if(x[i]<pivot)
            { ++i; printf("%f\n", i); }

            else if(x[j]>pivot)
            { --j; }

            else if(x[i]>=pivot && x[j]<=pivot)
            {
                swap( x[i], x[j] );
                ++i;
                --j;
            }
        }
        quicksort(x, first, i);
        quicksort(x, i+1, last);
    }       
  }

2 个答案:

答案 0 :(得分:1)

您没有展示swap()

如果这是一个功能,那么无法它可以成功,因为它只获得x[i]x[i]的值,而不是任何地址。

如果它是一个宏,它可能会起作用,但当然没有看到它就很难说。

答案 1 :(得分:1)

您的实施存在一些问题。导致您当前问题的那个很可能是swap函数,如果您测试它,我猜可能不会进行任何交换。我建议你用这样的东西替换它:

void
swap(double a[], int i, in j)
{
    double t = a[i];
    a[i] = a[j]; a[j] = t;
}

但之后,在您的实现中会出现其他问题,因为您没有正确地对列表进行分区。

这是一个参考实现(我将枢轴作为范围中的第一个元素,这是非最优的,但不比选择中间元素更优化。)

void
qsort(double a[], int lo, int hi)
{
   int i = lo, j = hi - 1;
   int pivot = a[i++];

   if(i+1 > j) return;

   while(i<j)
   {
       while(i < hi && a[i] < pivot) i++;
       while(j > lo && a[j] > pivot) j--;
       if(i<j) swap(a, i, j);
   }

   swap(a, lo, j);
   qsort(a, lo, j);
   qsort(a, j+1, hi);
}