[英]Peculiar behavior with mergesort implementation in C++, sorted result should not be in place
在下面歸並排序的執行,輸入指針inputIntArray
以某種方式受到破壞保持和卷起指向由指向的排序值sortedArray
。 實際上,考慮到調用delete[] intArray;
,我認為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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.