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

最初は、あなたが技術的にC++言語の一部ではない[可変長配列(https://en.wikipedia.org/wiki/Variable-length_array)を使用することです。しかし、コンパイラの中には、それらをポータブルではない拡張機能として言語に追加するものもあります。代わりに['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

このソリューションは私のために働いた...ありがとう@由紀..しかし、私のコードの欠陥は何ですか? –

+0

私は私の答えで言ったように、エラーがどこにあるのか、正しいロジックはどこにあるのか、それからエラーであると言うのは難しいです。あなたのコードと私のコードの違いを見てください(できるだけ小さなコードに変更しようとしました)、インラインコメントを考えて、あなたが望むものとどこが間違っているのかを理解することができます。私は主な問題は、あなたが計算したインデックスを混乱させ、それを使用すること、あるいは間違ったインデックスを作成することだと思います。 – Yuki