使用动态数组时的C++合并排序问题

问题描述

我正在尝试实现合并排序功能,但合并部分有问题。由于最初我不知道数组大小,我创建了一个临时动态数组来存储最终合并的数组。运行此方法时,出现堆损坏错误。当我将动态数组大小更改为 (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;
}

解决方法

初始化用作 itemp 的索引的 first1 是不好的,因为 temp 只有 firstlast

i 应该被初始化为零和循环

    for (int k = first; k <= last; k++) {
        arr[k] = temp[k];
    }

应该

    for (int k = first; k <= last; k++) {
        arr[k] = temp[k - first];
    }