【发布时间】:2013-01-06 08:25:30
【问题描述】:
当我运行代码时,我会得到很多重复的数字和/或大的负数,当你把东西添加到数组中时通常会出现这些数字。我相信问题出在我自己进行合并时。
void mergeSort( int list[], int lb, int ub )
{
int mid;
if ( lb < ub )
{
mid = (lb + ub) / 2;
mergeSort(list, lb, mid);
mergeSort(list, mid + 1, ub);
myMerge(list, lb, mid , ub);
}
}
template <class M>
void myMerge( M list[], int lb, int mid, int ub )
{
int i, j;
int size1 = mid - lb + 1;
int size2 = ub - mid;
M* tmpArray1 = new M[size1 + 1];
M* tmpArray2 = new M[size2 + 1];
for( i=0; i<size1; i++ )
{
tmpArray1[i] = list[lb + i - 1];
}
for( j=0; j<size2; j++ )
{
tmpArray2[j] = list[mid + j];
}
tmpArray1[size1 + 1] = INT_MAX;
tmpArray2[size2 + 1] = INT_MAX;
i = 0;
j = i;
for( int k=lb; k<ub; k++ )
{
if ( tmpArray1[i] <= tmpArray2[j] )
{
list[k] = tmpArray1[i];
i++;
}
else
{
list[k] = tmpArray2[j];
j++;
}
}
}
这可能是一些愚蠢的问题,比如迭代问题......有什么想法吗?
【问题讨论】:
-
尝试通过
valgrind运行它;它会比我们更快地发现错误! -
你需要自己写这个吗(例如,为了家庭作业)?如果没有,请使用
std::merge。 -
[Aside] 您的合并算法正在疯狂地泄漏内存(准确地说,每次调用 mergesort 时都会泄漏 O(n lg n) 个单元格),因为您没有
delete[]任何东西。跨度> -
是的,它用于家庭作业,不能使用 std::merge。我知道泄漏。谢谢你。
-
很遗憾你不能use std::merge。它使编写起来非常容易。