-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
このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –
出力はどのように間違っていますか?それはあなたにソートされていない結果を与えていますか?ソートされた結果が得られますが、マージソートを正しく実行していませんか?あなたの質問に出力例を投稿すると便利です。 – PrestonM
あなたは 'delete [] temp1;'と 'delete [] temp2;'が見つからないようですね?結果には影響しませんが、割り当てられたものをリリースすることを忘れないでください。 –