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);
}