簡體   English   中英

C 快速排序分段錯誤

[英]C quicksort segmentation fault

我想用 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;
}

好吧,您似乎在理解快速排序時犯了一個簡單的錯誤。

問題是您在調用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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM