gpt4 book ai didi

c++ - mergesort C++ 实现越界索引访问

转载 作者:行者123 更新时间:2023-11-28 02:21:36 24 4
gpt4 key购买 nike

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

关于c++ - mergesort C++ 实现越界索引访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32254097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com