【发布时间】:2013-02-19 10:17:57
【问题描述】:
我正在尝试读取包含随机数列表的文本文件,并使用合并排序对它们进行排序以显示。这些数字被读入动态数组。不幸的是,每当我尝试删除未使用的数组时,都会检测到堆损坏错误。
合并排序功能:
void mergesort(int *arr, int first, int last)
{
if(first < last)
{
int middle = ((first + last)/2);
mergesort(arr, first, middle);
mergesort(arr, middle+1, last);
merge(arr, first, last);
}
}
删除 tempArr 时合并函数发生错误:
void merge(int *arr, int first, int last)
{
int *tempArr = new int[last];
int mid = (first+last)/2;
int first1 = first;
int last1 = mid;
int first2 = mid + 1;
int last2 = last;
int index = first1;
for(; (first1 <= last1) && (first2 <= last2); ++index)
{
if (arr[first1] < arr[first2])
{
tempArr[index] = arr[first1];
++first1;
}
else
{
tempArr[index] = arr[first2];
++first2;
}
}
for(; first1 <= last1; ++first1, ++index)
tempArr[index] = arr[first1];
for(; first2 <= last2; ++first2, ++index)
tempArr[index] = arr[first2];
for(index=first;index<=last;++index)
arr[index] = tempArr[index];
delete [] tempArr;
}
【问题讨论】:
-
除了使用
new、delete和流之外,我不会称之为C++。使用引用而不是指针来“通过引用”传递参数,并使用std::vector而不是原始数组。 -
至于您的问题,请在调试器中运行,并逐行逐行执行代码,同时确保不覆盖数组的末尾。
-
请注意
(first+last)/2会溢出——first + (last - first)/2更安全。 -
感谢您的回复,事实证明将 '(first+last)/2' 更改为 'first + (last - first)/2' 解决了堆损坏错误。但是,我的输出不正确。我得到的不是“1 2 3 4 5 6 7 8 9 10”,而是“-33686019 1 2 3 4 5 6 7 8 9”,其中第一个值已损坏。
-
你需要通过调试器来解决这个问题。索引显然不在某处。
标签: c++ mergesort dynamic-arrays