我想在c中编写一个快速排序代码,当我尝试运行此代码时,编译器抱怨“分段错误(内核已转储)”。我找不到问题所在。 有人可以帮我找到问题吗?谢谢。
#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;
}
答案 0 :(得分:1)
看来您在理解快速排序时犯了一个简单的错误。
问题是,您在调用partition()
时将数据透视元素放置在数组中的正确位置。
我的意思是将最初在数组中的元素视为
[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);
}
}