C快速分段故障

问题描述 投票:2回答:1

我想在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;
}
c segmentation-fault quicksort
1个回答
1
投票

好吧,看起来你在理解快速排序方面犯了一个简单的错误。

问题是你在调用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);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.