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

C 为什么这个快速排序例程不起作用?,c,quicksort,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];

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

  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);
    }       
  }
void快速排序(双x[],int-first,int-last)
{
int i=第一;
int j=最后一个;

如果((j-i)您没有显示
swap()

如果这是一个函数,它就不可能成功,因为它只获取
x[i]
x[i]
的值,而不获取任何地址


如果它是一个宏,它可能会工作,但是如果不看到它,当然很难判断。

您的实现存在一些问题。导致您当前问题的最可能是
swap
函数,如果您对它进行测试,我猜它可能不会进行任何交换。我建议您将其替换为类似的功能这:

void
swap(double a[], int i, in j)
{
    double t = a[i];
    a[i] = a[j]; a[j] = t;
}
但是在那之后,在您的实现中会有其他问题,因为您没有正确地对列表进行分区

这里是一个参考实现(我将轴心作为范围中的第一个元素,这是非最佳的,但并不比选择中间的元素差)

void
qsort(双a[],内低,内高)
{
int i=lo,j=hi-1;
int pivot=a[i++];
如果(i+1>j)返回;
而(i-lo&a[j]>pivot)j--;

如果(我知道这一点,这里是我的交换例程:void swap(double a,double b){double temp;temp=a;a=b;b=temp;}@user2976296这是你的问题,就在那里。正如我所说,
swap()
不能是一个基于你如何使用它的函数。
swap()
无法更改
x[]
在调用方的上下文中。首先,这不是快速排序。事实上,这不是排序。检查复制的内容,如果(iThanks,如何正确划分列表?参考实现incoming@user2976296通过正确地编码快速排序?仅此网站上就有数百个关于快速排序的问题,大多数都有功能示例,无论是在问题中还是在发布的答案中。
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);
}