2017-06-16 60 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