归并排序c++实现脱界索引访问

mergesort c++ implementation out of bound index accessing

本文关键字:索引 访问 c++ 实现 归并排序      更新时间:2023-10-16

我正在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);
    }
}

开头:

mergeSortHelper(array, 0, length);

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

如果你以:

开头可能效果更好。
mergeSortHelper(array, 0, length-1);