2016-09-19 3 views
-4

C++のテンプレート関数を使用してマージソートアルゴリズムを作成しようとしています。出力は近いが正しくない。私は具体的には、問題がマージソート機能ではなくマージ機能にあると考えています。どんな助けでも大歓迎です。ここに私のコードは次のとおりです。マージソートの出力が正しくありません

template <class T1> 
void mergeSort(T1 array[], int lower, int upper) 
{ 
    if (lower < upper) 
    { 
     int middle = (lower + upper)/2; 

     mergeSort(array, lower, middle); 
     mergeSort(array, middle + 1, upper); 
     merge(array, lower, middle, upper); 
    } 
} 

template <class T1> 
void merge(T1 array1[], int lower, int middle, int upper) 
{ 
    int i = 0, 
     j = 0, 
     k = 0; 
    int size1 = middle - lower + 1; 
    int size2 = upper - middle; 
    T1* temp1 = new T1[size1]; 
    T1* temp2 = new T1[size2]; 

    for (int i = 0; i < size1; i++) 
    { 
     temp1[i] = array1[lower + i]; 
    } 
    for (int j = 0; j < size2; j++) 
    { 
     temp2[j] = array1[middle + 1 + j]; 
    } 

    while (i < size1 && j < size2) 
    { 
     if (temp1[i] < temp2[j]) 
     { 
      array1[k] = temp1[i]; 
      i++; 
     } 
     else 
     { 
      array1[k] = temp2[j]; 
      j++; 
     } 
     k++; 
    } 

    if (i == size1) 
    { 
     while (j < size2) 
     { 
      array1[k] = temp2[j]; 
      k++; 
      j++; 
     } 
    } 
    else 
    { 
     while (i < size1) 
     { 
      array1[k] = temp1[i]; 
      k++; 
      i++; 
     } 
    } 
} 

int main(){ 
    int a[] = { 7, 6, 4, 8, 1, 2, 3 }; 
    mergeSort(a, 0, 6); 
} 

出力:それは間違った場所にマージの結果を書きますので、あなたが0にkを初期化するべきではありませんあなたのmerge機能で

1 1 2 2 3 3 8 
+3

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

出力はどのように間違っていますか?それはあなたにソートされていない結果を与えていますか?ソートされた結果が得られますが、マージソートを正しく実行していませんか?あなたの質問に出力例を投稿すると便利です。 – PrestonM

+1

あなたは 'delete [] temp1;'と 'delete [] temp2;'が見つからないようですね?結果には影響しませんが、割り当てられたものをリリースすることを忘れないでください。 –

答えて

2

。代わりにklowerに初期化する必要があります。これは実際にソートしているパーツの開始インデックスです。

+0

ありがとう、今私には明らかです! – SPFort

関連する問題