2016-10-17 6 views
0

私はC++とアルゴリズムが初めてです。私が書いたマージソートアルゴリズムでは混乱しています。私はエラーがないときにコードが正解を得ない理由を知らない。コードでは、入力した5つの数字を並べ替える必要があります。ソートされた配列は画面に表示されません。私は自分のコードの問題を知りたい。どうもありがとう。マージソートアルゴリズムが正しい答えを得られない

#include<iostream> 
using namespace std; 
int merge(int a[], int low, int mid, int high) { 
    int h = low; int j = mid + 1; int k = low; 
    int *b = new int[high - low + 1]; 
    while ((h <= mid) && (j <= high)) { 
     if (a[h] < a[j]) 
      b[k++] = a[h++]; 
     else 
      b[k++] = a[j++]; 

    } 
    if (h > mid) { 
     for (j; j <= high;++j) 
      b[k++]=a[j]; 
    } 
    if (j > high) { 
     for (h; h <= mid; ++h) 
      b[k++] = a[h]; 
    } 
    for (int i = low; i <= high; ++i) 
     a[i] = b[i]; 
    delete []b; 
    return 0; 
} 
int MergeSort(int a[], int low, int high) { 
    if (low < high) { 
     int mid = (low + high)/2; 
     MergeSort(a, low, mid); 
     MergeSort(a, mid + 1, high); 
     merge(a, low, mid, high); 
    } 
    return 0; 
} 

int main() { 
    int const n(5); 
    int a[n]; 
    cout << "Input " << n << " numbers please:"; 
    for (int i = 0; i < n; ++i) { 
     cin >> a[i]; 
    } 
    MergeSort(a, 0, n - 1); 
    for (int i = 0; i <= n - 1; ++i) 
     cout << a[i] << " "; 
    cout << endl; 
} 
+0

コードをデバッグしようとしましたか? – HazemGomaa

+1

@Amierは、あなたが間違った答えを与えている入力を教えてくれますか?コードは私のシステムで正常に動作するようです..! –

+1

ちょうどいくつかのコードがエラーなしでコンパイラを通過しているからといって、正しいものでなければならないわけではありません。 *未定義の動作*または他の*論理エラー*には多くの可能性があります。まず、より多くの警告をオンにして、エラーであるかのように修正してください。次に、デバッガを使用する方法と、変数を監視しながらコードを1行ずつ進める方法を学習する必要があります。 –

答えて

1

MergeSort機能 - low + 1 == highようmid==lowを前提としています。 MergeSort(a, mid, high)が再び同じlowを渡すとhighされる一方MergeSort(a, low, mid)

再帰呼び出しは、すぐに戻ります - (?とあなたは再びSOに質問を投稿します)アプリケーションはスタックがオーバーフローするまで


mergeとすると、low==3,mid==4,high==5とする。

b[]3に割り当てます。ここまでは順調ですね。

しかし、その後、あなたは(3)k=lowで始まり、b[k++]の割り当てを行う - b[0]b[1]が手つかずのままになりながら(すでに境界の外にも多くの次のステップであなたがb[4]で書くことになりますときとb[5] )。あなたはおそらく何をしたいのか

などなど(for (int i = low; i <= high; ++i) a[i]=b[i];含む)

は(whileサイクルの終わりにk++続いb[k-low])オフセット- lowで一時ストレージにすべての割り当てを実行することです。

0

小さな問題が見つかりました。この簡単な修正を試してください。

for (int i = 0; i <= n - 1; ++i) { 
     cout << a[i] << " "; 
     cout << endl; 
    } 

あなたのコードには、forステートメントの角括弧がありませんでした。 このコードは、この修正プログラムをインストールしたコンピュータで動作します。

関連する問題