简体   繁体   English

使用C ++中的mergesort实现的特殊行为,排序结果不应到位

[英]Peculiar behavior with mergesort implementation in C++, sorted result should not be in place

In the implementation below of mergesort, the input pointer inputIntArray is somehow kept from being destroyed and winds up pointing to the sorted values pointed by sortedArray . 在下面归并排序的执行,输入指针inputIntArray以某种方式受到破坏保持和卷起指向由指向的排序值sortedArray As it is, I thought inputIntArray would not point to anything given the call delete[] intArray; 实际上,考虑到调用delete[] intArray; ,我认为inputIntArray不会指向任何东西delete[] intArray; just before the last merge. 在最后一次合并之前。 Could anyone please shed some light on this? 有人能对此有所启发吗? Thank you. 谢谢。

#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;
}

Here is the output: 这是输出:

156237
123567
123567

You have this call: 您有这个电话:

int* sortedArray = mergeSort(inputIntArray, 6);

In the process of executing that code, you do: 在执行该代码的过程中,您需要执行以下操作:

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

It is certainly possible that sortedArray gets the same address as the just deleted inputIntArray . 这当然是可能的, sortedArray得到了相同的地址作为刚刚删除inputIntArray

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM