2017-06-16 16 views
-1

有人可以告訴我爲什麼我在排序後得到垃圾值嗎? 最初的調用是(A,0,n)其中n是數組的大小?我想使用合併排序算法對數組進行排序,但沒有定位值。Merge_sort without sentinel

void merge_sort(int A[], int l, int mid, int r) 
{ 
    int n1 = mid - l + 1; 
    int n2 = r - mid; 

    int L[n1], R[n2]; 

    for (int i = 0; i < n1; i++) 
    { 
     L[i] = A[i]; 
    } 

    for (int i = 0; i <= n2; i++) 
    { 
     R[i] = A[i + mid + 1]; 
    } 
    cout << endl; 

    int j = 0, k = 0; 

    for (int i = l; i < r; i++) 
    { 
     if (j == n1 || k == n2) 
     { 
      if (j == n1 + 1) 
      { 
       A[i] = R[k]; 
       k++; 
      } 
      else 
      { 
       A[i] = L[j]; 
       j++; 
      } 
     } 
     else if (L[j] >= R[k]) 
     { 
      A[i] = L[j]; 
      j++; 
     } 
     else 
     { 
      A[i] = R[k]; 
      k++; 
     } 
    } 
} 

void merge_divide(int A[], int l, int r) 
{ 
    if (l < r) 
    { 
     int mid = (l + r)/2; 
     merge_divide(A, l, mid); 
     merge_divide(A, mid + 1, r); 
     merge_sort(A, l, mid, r); 
    } 
} 
+2

我注意到的第一件事是,使用[可變長度數組(https://en.wikipedia.org/wiki/Variable-length_array),其在技術上不是C++語言的一部分。儘管如此,一些編譯器將它們添加爲語言的非可移植擴展。我建議你改用['std :: vector'](http://en.cppreference.com/w/cpp/container/vector)。 –

+0

如果你想成爲一名開發人員,程序不能成爲你的黑匣子。換句話說,使用調試器並逐步運行您的代碼。什麼var值和你的預期比較。 – Ripi2

+0

怎麼了隨機'cout << endl;'? – KABoissonneault

回答

0

你的邏輯中有很多動作難以閱讀。很難區分哪裏出錯或者有什麼意圖。但這裏是我如何看待修復。請參閱行內評論。

void merge_sort(int A[], int l, int mid, int r) { 
    int n1 = mid - l; 
    int n2 = r - mid; 

    // this is C, but not C++, consider using vector instead 
    int L[n1], R[n2]; 

    for (int i = 0; i < n1; i++) { 
    // need `l` here 
    L[i] = A[l + i]; 
    } 

    for (int i = 0; i < n2; i++) { 
    // need to include `mid` 
    R[i] = A[i + mid]; 
    } 

    int j = 0, k = 0; 

    for (int i = l; i < r; i++) { 
    if (j == n1) { 
     A[i] = R[k]; 
     k++; 
    } else if (k == n2) { 
     A[i] = L[j]; 
     j++; 
    } else if (L[j] >= R[k]) { 
     A[i] = L[j]; 
     j++; 
    } else { 
     A[i] = R[k]; 
     k++; 
    } 
    } 
} 

void merge_divide(int A[], int l, int r) { 
    // need properly compute `mid` here 
    int mid = r - l; 
    if (mid > 1) { 
    mid = l + mid/2; 
    merge_divide(A, l, mid); 
    merge_divide(A, mid, r); 
    merge_sort(A, l, mid, r); 
    } 
} 

int main() { 
    int A[] = {2, 4, 3, 382, 2342334, 3, 42, 234}; 
    int n = sizeof(A)/sizeof(int); 
    merge_divide(A, 0, n); 
    for (int i = 0; i < n; ++i) 
    cerr << A[i] << " "; 
    cout << endl; 
} 
+0

這個解決方案爲我工作......謝謝@Yuki ..但是我的代碼中有什麼錯? –

+0

正如我在我的回答中所說的,很難說哪裏是錯誤,哪裏是正確的邏輯,哪裏是錯誤。只要看看我的代碼與你的代碼的區別(我試圖儘可能少地改變代碼),考慮內聯評論,然後你就可以理解你想要什麼以及哪裏出錯了。我認爲主要問題是你計算和你使用的索引混淆,或者索引完全錯誤。 – Yuki