我想在c中编写一个quicksort代码,当我尝试运行此代码时,编译器会抱怨“Segmentation fault(core dumped)”。我找不到问题所在。有人可以帮我找到问题吗?谢谢。
#include <stdio.h>
void swap(int *m,int *n)
{
int t;
t = *m;
*m = *n;
*n = t;
}
int partition(int *a,int lo,int hi)
{
int pivot = a[hi];
int i = lo;
for(int j = lo;j < hi;j++)
{
if(a[j] < pivot)
{
//swap(&a[i],&a[j]);
int t = a[i];
a[i] = a[j];
a[j] = t;
i++;
}
}
// swap(&a[i],&a[hi]);
int t = a[hi];
a[hi] = a[i];
a[i] = t;
return i;
}
void quicksort(int *a,int lo,int hi)
{
if(lo < hi)
{
int p = partition(a,lo,hi);
quicksort(a,lo,p);
quicksort(a,p+1,hi);
}
}
int main(void)
{
int a[10] = {3,4,6,7,5,8,9,2,1,0};
quicksort(a,0,9);
for(int i = 0;i < 10;i++)
printf("%d ",a[i]);
return 0;
}
好吧,看起来你在理解快速排序方面犯了一个简单的错误。
问题是你在调用partition()
时将pivot元素放在数组内的正确位置。
我的意思是将最初在数组中的元素视为
[ 3 , 4 , 6 , 7 , 5 , 8 , 9 , 2 , 1 , 4 ]
在调用partition()
之后,数组应该看起来像这样(请注意,您已选择最后一个元素作为枢轴元素,上面标有粗体)
[ 3 , 2 , 1 , 4 , 5 , 8 , 9 , 4 , 6 , 7 ]
现在阵列应该分为三个部分
[ 3 , 2 , 1 ] [ 4 ] [ 5 , 8 , 9 , 4 , 6 , 7 ]
我们知道枢轴元件处于正确位置,因此无需触摸中间部分,只需继续保留左右部分即可。
你所做的只被认为是partition()
之后的两个部分
[ 3 , 2 , 1 , 4 ] [ 5 , 8 , 9 , 4 , 6 , 7 ]
现在为[3,2,1,4],当你调用quicksort()
时,它将进入无限递归。
我修改了下面的部分,希望它有所帮助
void quicksort(int *a,int lo,int hi)
{
if(lo < hi)
{
int p = partition(a,lo,hi);
quicksort(a,lo,p-1);
quicksort(a,p+1,hi);
}
}