原函数里的array[0]=15与array[1]=-3与局部函数里为何返回后不一样?如何修改?

情况:

原函数里的array[0]=15与array[1]=-3与局部函数里的array[0]=-3,array[1]=15,为何返回后不一样?怎么修改才能一样?

原代码:

/left=2,right=3,array1={15},array2={-3}/

int* Merge(int* array1, int* array2, int left, int right)
{
int index1, index2, mid;
int length = right - left + 1;
int* array = new int[length];
int childlength = (right - left) / 2 + 1;
mid = (left + right) / 2;
index1 = 0;
index2 = 0;
if (childlength == 1)
{
if (array1[0] <= array2[0])
{
array[0] = array1[0];
array[1] = array2[0];
}
else
{
array[0] = array2[0];
array[1] = array1[0];
}
}

return array;

}

调试结果:

返回原函数之前:

img

返回原函数之后:

img

img

img

img

img

看不懂,代码没贴全,但我猜你是在写归并排序。我之前写过的2个版本,你可以参考下,有用的话,给通过下,谢谢。https://blog.csdn.net/weixin_44001521/article/details/108892180

img

看你发的截图里面,在Merge外面应该是已经有一个array变量了,而且这个变量已经有值了。但是,在Merge函数中,你返回的array是重新new出来的一个变量,当merge函数执行完毕返回时,你把Merge函数中new出来的这个变量的值赋给了外部变量array,也就是用新new出来的变量把原来的外部变量覆盖掉了,注意,这里是覆盖,也就是说,原来外部变量array中的值全部丢失了,因为你让全局变量的array的值指向了Merge函数新new出来的变量的值,此时的array就不是原来的array了。

img

#include
using namespace std;

int* Merge(int* array1, int* array2, int left, int right)
{
int index1, index2, mid;
int length = right - left + 1;
int* array = new int[length];
int childlength = (right - left) / 2 + 1;
mid = (left + right) / 2;
index1 = 0;
index2 = 0;
if (childlength == 1)
{
if (array1[0] <= array2[0])
{
array[0] = array1[0];
array[1] = array2[0];
}
else
{
array[0] = array2[0];
array[1] = array1[0];
}
}
while (childlength > 1)
{
int i = 0;
while (index1 < childlength && index2 < childlength)
{
if (array1[index1] <= array2[index2])
{
array[i] = array1[index1++];
}
else
{
array[i] = array2[index2++];
}
i++;
}
while (index1 < childlength)
{
array[i++] = array1[index1++];
}
while (index2 < childlength)
{
array[i++] = array2[index2++];
}
}
return array;
}

void MergeSort(int* array, int left, int right)
{
int mid, i;
mid = (right + left) / 2;
int childlength = (right - left) / 2 + 1;
int length = right - left + 1;
if (left == right)
{
return;
}
else
{
int* a1 = new int[(right - left) / 2 + 1];
int* a2 = new int[(right - left) / 2 + 1];
for (int k2 = 0, i = 0; i < childlength; k2++, i++)
{
a1[k2] = array[i];
}
for (int k1 = 0, i = childlength; i < length; k1++, i++)
{
a2[k1] = array[i];
}

    MergeSort(a1, left, mid);
    MergeSort(a2, mid + 1, right);
    array = Merge(a1, a2, left, right);
}

}

int main()
{
int length = 8;
int array[8] = { 1,4,15,-3,6,12,-5,9 };
int left = 0;
int right = length - 1;
MergeSort(array, left, right);
cout << "MAXΪ" << array[right - 1] << endl;
cout << "MINΪ" << array[0] << endl;
}

帮你改好了,原来代码存在3个问题:1、array1、array2的长度是不一定等的;2、MergeSort要考虑的是array1\array2的长度,而不是原来的;3、你用了动态数组,没有释放空间在后面
#include
using namespace std;

void Merge(intarray, int array1, int* array2, int left, int right)
{
if (left >= right) return;
int i = 0, mid = (left + right) >> 1, j = 0;
int lnum = mid - left + 1, rnum = right - mid;
int* tmp = (int*)malloc(sizeof(int) * (lnum + rnum));
int k = 0;
while (i <lnum && j <rnum) {
tmp[k++] = array1[i] < array2[j] ? array1[i++] : array2[j++];
}
while (i < lnum)
tmp[k++] = array1[i++];
while (j < rnum)
tmp[k++] = array2[j++];
for (i = 0; i < k; i++) {
array[left + i] = tmp[i];
}
free(tmp);
}

void MergeSort(int* array, int left, int right)
{
int mid, i;
mid = (right + left) / 2;
// int childlength = (right - left) / 2 + 1;
int length = right - left + 1;
if (left == right){
return;
}
else {
int* a1 = new int[(right - left) / 2 + 1];
int* a2 = new int[(right - left) / 2 + 1];
int k1, k2;
for ( k2 = 0, i = 0; i <= mid; k2++, i++)
{
a1[k2] = array[i];
}
for ( k1 = 0, i = mid+1; i < length; k1++, i++)
{
a2[k1] = array[i];
}
MergeSort(a1, 0, k2-1);
// MergeSort(a1, left, mid);
MergeSort(a2, 0,k1-1);
// MergeSort(a2, mid + 1, right);
Merge(array, a1, a2, left, right);
delete[]a1;
delete[]a2;
}
}

int main()
{
int length = 8;
int array[8] = { 1,4,15,-3,6,12,-5,9 };
int left = 0;
int right = length - 1;
MergeSort(array, left, right);
cout << "MAXΪ" << array[right - 1] << endl;
cout << "MINΪ" << array[0] << endl;
/*
for (int i = 0; i < 8; i++)
cout << array[i] << " ";
*/
}