【发布时间】:2021-02-21 11:39:38
【问题描述】:
我正在尝试实现合并排序功能,但合并部分有问题。因为最初,我不知道数组大小,所以我创建了一个临时动态数组来存储最终合并的数组。当我运行这个方法时,我得到一个堆损坏错误。当我将动态数组大小更改为 (last + 1) 时,该方法运行时不会出现错误。我不知道为什么这会导致问题,因为最终数组中的元素数量必须是 last - first + 1。
我的合并功能
void merge(int arr[], int first, int mid, int last) {
int* temp = new int[last - first + 1];
int first1 = first;
int last1 = mid;
int first2 = mid + 1;
int last2 = last;
int i = first1;
while (first1 <= last1 && first2 <= last2) {
if (arr[first1] < arr[first2]) {
temp[i] = arr[first1];
first1++;
}
else {
temp[i] = arr[first2];
first2++;
}
i++;
}
while (first1 <= last1) {
temp[i] = arr[first1];
first1++;
i++;
}
while (first2 <= last2) {
temp[i] = arr[first2];
first2++;
i++;
}
for (int k = first; k <= last; k++) {
arr[k] = temp[k];
}
delete[] temp;
}
【问题讨论】:
-
如果您忘记了 first/mid/last 的概念,而只使用 (a) 指针算法来调整到段的基地址,并且 (b ) 一个简单的 mid/len 表示相关段的中点和长度。它需要更改合并排序算法,但此后合并变得微不足道。它允许你实现
mergesort(int *arr, size_t len)(不是没有第一个,最后一个;只有一个len)。
标签: c++ mergesort dynamic-arrays