gpt4 book ai didi

c++ - C++ 中合并排序实现的特殊行为,排序结果不应该到位

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:23 24 4
gpt4 key购买 nike

在下面的归并排序实现中,输入指针 inputIntArray 以某种方式保持不被破坏,并最终指向 sortedArray 指向的排序值。事实上,我认为 inputIntArray 不会指向任何给定调用 delete[] intArray; 就在最后一次合并之前。任何人都可以对此有所了解吗?谢谢。

#include <iostream>
using namespace std;

int* getSubArray (int*,int,int);
int* merge(int*,int*,int,int);

int* mergeSort ( int* intArray , int n ) {
if (n==1){
return intArray;
}
else {
int m = n/2;
int* leftArray = mergeSort ( getSubArray (intArray,0,m-1) , m );
int* rightArray = mergeSort ( getSubArray (intArray,m,n) , n-m );
delete[] intArray;
return merge(leftArray,rightArray,m,n);
}
}

int* getSubArray ( int* intArray , int start , int end ){
int n = end - start + 1;
int * subIntArray = new int [ n ];
for (int i=0;i<n;i++){
subIntArray[i]=intArray[i+start];
}
return subIntArray;
}

int* merge(int* leftArray, int* rightArray, int m, int n){
int* intArray = new int[n];
int i=0 , j=0;
for (int k=0;k<n;k++){
if ( i == m && j == n ) {
break;
}
if (leftArray[i]<=rightArray[j] && i < m){
intArray[k]=leftArray[i++];
}
else {
intArray[k]=rightArray[j++];
}
}
delete[] leftArray;
delete[] rightArray;
return intArray;
}

int main () {

int* inputIntArray = new int[6]{1,5,6,2,3,7};
for (int i=0;i<6;i++){
cout << inputIntArray[i];
}
cout << endl;

int* sortedArray = mergeSort ( inputIntArray , 6 );
for (int i=0;i<6;i++){
cout << inputIntArray[i];
}
cout << endl;
for (int i=0;i<6;i++){
cout << sortedArray[i];
}
cout << endl;
delete[] sortedArray;
}

这是输出:

156237
123567
123567

最佳答案

你有这个电话:

int* sortedArray = mergeSort(inputIntArray, 6);

在执行该代码的过程中,您会:

delete[] inputIntArray;
sortedArray = new int[6];

sortedArray 肯定有可能得到与刚刚删除的 inputIntArray 相同的地址。

关于c++ - C++ 中合并排序实现的特殊行为,排序结果不应该到位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26133197/

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