【问题标题】:C++ merge sort problem while using dynamic array使用动态数组时的C ++合并排序问题
【发布时间】: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


【解决方案1】:

初始化i(用作tempfirst1 的索引)是不好的,因为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];
    }

【讨论】:

  • 非常感谢。我什至没想到会出现这个问题。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 2021-06-02
  • 2011-02-09
  • 2013-01-06
  • 1970-01-01
相关资源
最近更新 更多