【问题标题】:mergesort c++ implementation out of bound index accessing合并排序 C++ 实现越界索引访问
【发布时间】:2015-08-27 15:50:08
【问题描述】:

我正在用 C++ 实现 CLRS 算法教科书中的合并排序伪代码。在我的代码中的某处,我访问了一个不在数组边界内的数组元素。我不确定为什么会发生这种情况(它发生在左侧 == 数组大小 -1、中间 == 左侧、右侧 == 数组大小时)。我真的很感激任何帮助。 这是我的实现。

void merge(int array[], int left, int middle, int right) {
    int left_size = middle - left + 1; //include middle
    int right_size = right - middle;

    int *left_array = new int[left_size];
    int *right_array = new int[right_size];

    for (int i = 0; i < left_size; i++)
        left_array[i] = array[left + i];
    for (int i = 0; i < right_size; i++)
        right_array[i] = array[middle + i + 1];

    int i = 0;
    int j = 0;
    int cur = left;

    printArray(left_array, left_size);
    printArray(right_array,right_size);

    while (i < left_size and j < right_size) {
        if (left_array[i] < right_array[j])
            array[cur] = left_array[i++];
        else
            array[cur] = right_array[j++];
        cur++;
    }

    while (i < left_size) {
        array[cur] = left_array[i++];
        cur++;
    }
    while (j < right_size) {
        array[cur] = right_array[j++];
        cur++;
    }

    delete [] left_array;
    delete [] right_array;
}

这就是我调用合并函数的方式:

void mergeSort(int array[], int length) {
    mergeSortHelper(array, 0, length);
}


//left inclusive, right exclusive
void mergeSortHelper(int array[], int left, int right) {
    if (left < right) {
        int middle = floor((left + right) / 2);
        mergeSortHelper(array, left, middle);
        mergeSortHelper(array, middle + 1, right);
        merge(array, left, middle, right);

    }
}

【问题讨论】:

  • 您在使用调试器单步执行代码时观察到了什么?

标签: c++ arrays mergesort


【解决方案1】:

当你开始时:

mergeSortHelper(array, 0, length);

您将使用array[length]array [length-1] 是最后一个有效的引用。

如果你从以下开始可能会更好:

mergeSortHelper(array, 0, length-1);

【讨论】:

  • 哇,我完全错过了。谢谢!
  • @coder009 on StackOverflow 如果你喜欢一个答案,投赞成票被认为是礼貌的(单击左边距数字上方的三角形)。在提出您认为已完全回答的问题后,单击数字下方的复选标记(勾选符号)选择该答案也是一种礼貌。
猜你喜欢
  • 2019-05-13
  • 2017-03-22
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2016-03-09
  • 1970-01-01
相关资源
最近更新 更多