-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);
}
출력 :이 잘못된 위치에 병합의 결과를 기록합니다 때문에 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;'가 빠진 것 같습니까? 결과에 영향을 미치지는 않겠지 만 할당 한 것을 릴리스하는 것을 잊지 마십시오. –