簡體   English   中英

C ++ Mergesort細分錯誤?

[英]C++ Mergesort Segmentation Fault?

我似乎在運行此mergesort時遇到了一些麻煩。 當我嘗試使用g ++運行它時,終端上顯示“分段錯誤(內核已轉儲)”,我不知道是什么原因導致了這種情況的發生(您可能會說我仍然是一個初學者)。 有人可以幫忙嗎?

#include <iostream>
using namespace std;


void merge (int*, int, int, int);

void mergesort (int* A, int p, int r){

 if (p < r){

  int q = (p+r)/2;
  mergesort (A, p, q);
  mergesort (A, q+1, r);
  merge ( A, p , q, r);
  }
}

void merge (int* A, int p, int q, int r){


  int n = q-p+1;
  int m = r-q ;
   int L [n+1];
  int R [m+1];

  for (int i=1;i <n+1;i++)
       L[i] = A[p+i-1];

  for (int j=1; j< m+1; j++)
      R[j] = A[q+j];

L[n+1];
R[m+1];

 int i= 1;
 int j=1;

for (int k = p; k= r + 1; k++){
   if (L[i] <= R[j]){
      A[k] = L[i];
       i+=1;
   }
   else{
     j += 1;
    }
}
}


int main() {

int A [15] = {1, 5, 6, 7,3, 4,8,2,3,6};

mergesort (A, 0, 9);

for (int i=0; i <9; i++){
cout << A[i] << endl;
}

return 0;
}

非常感謝!

您的實現中有三件事要么沒有意義,要么是完全錯誤的:

首先這些:

L[n+1];
R[m+1];

這些陳述都沒有任何作用,我也不知道您要做什么。

接下來,一個重要的錯誤:

for (int k = p; k= r + 1; k++){

此for循環的條件子句是賦值 k = r + 1 由於r在循環內的任何地方都不會改變,因此表達式為false的唯一方法是if r == -1 ,它永遠不會。 您剛剛在計數器k上創建了一個無限循環,該循環將一直運行到平流層中,並在進程索引中進行寫入,並寫入到在進程中不再有效的內存中。 結果,這是未定義的行為 我很確定你想要這個:

for (int k = p; k< (r + 1); k++){

盡管我沒有進一步剖析您的算法,但我無法評論這是否是有效的限制。 我沒有花時間進一步調試它。 我留給你。

編輯 在您的主要mergsesort中,這不是“錯誤”,但很容易溢出

int q = (p+r)/2;

考慮一下這個:

int q = p + (r-p)/2;

尤其重要的是:

int L [n+1];
int R [m+1];

使用C ++標准不支持的可變長度數組擴展。 您可能要使用std::vector<int> L(n+1)等。

在您的情況下,當您嘗試讀取內存時可能導致分段錯誤,因為該變量不存在變量,例如,假設您有一個名為foo的數組,其大小為10(so foo[10] ),並且此語句foo[11]將導致分割錯誤。

您需要做的是使用調試語句打印出索引變量(i,j,n,m,p和q),並查看其中是否大於數組大小

編輯:另一個不相關的問題是,您不應該using namespace std ,如果您不小心,這行代碼可能會導致范圍問題,請記住:)

暫無
暫無

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

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