我遇到合并排序问题。我正在使用下面的代码,并且我检测到了堆损坏。当我尝试释放内存时会发生这种情况,所以我想我会编写一个超出范围的索引。
更具体地说,我认为它是最后一个for循环。当我打印出数组时,第一个索引是一些垃圾编号,最后一个索引实际上是我想要的最后一个索引。我已经尝试了所有的东西而且我无法解决这个问题,有人可以告诉我,我做错了什么吗? '因为我似乎无法理解问题所在。
以下是我使用的代码:
template <class T>
int Mergesort(T arr[], int n) {
MergeSortRec(arr, 0, n, n);
return 0;
}
template <class T>
void MergeSortRec(T arr[], int left, int right, int size) {
if(right > left) {
int mid = ((left + right) /2);
MergeSortRec(arr, left, mid, size);
MergeSortRec(arr, mid+1, right, size);
Merge(arr, left, mid, right, size);
}
return;
}
template <class T>
void Merge(T arr[], int left, int mid, int right, int size) {
int i = 0;
int j = left;
int k = mid + 1;
T* temp = new T[right - left];
while(j <= mid && k <= right) {
if(arr[j] < arr[k]) {
temp[i++] = arr[j++];
} else {
temp[i++] = arr[k++];
}
}
while(j <= mid) {
temp[i++] = arr[j++];
}
while(k <= right) {
temp[i++] = arr[k++];
}
for(int a = left; a <= right; a++) {
arr[a] = temp [a-left];
}
干杯。
答案 0 :(得分:3)
问题在于:
T* temp = new T[right - left];
//...
for(int a = left; a <= right; a++) {
arr[a] = temp [a-left];
}
您分配right-left
元素,但for
循环逐步执行right-left+1
个条目,因此您将运行数组的末尾并践踏您不应该的某些内存。如果你在delete [] temp;
循环之后添加了for
(没有它就会泄漏内存!),你可能会更早地看到你的错误。
事实上,你所有的循环都走得太远了;它在这个简单的循环中最为明显。