我试图用它来对随机生成的数字进行排序,所以我打印随机数,应用快速排序然后打印排序列表,但它只是再次以相同的顺序给我数字。
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);
}
}
答案 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);
}