【问题标题】:C++ - Why is the merge function reversing an array after recursively calling it?C++ - 为什么合并函数在递归调用后反转数组?
【发布时间】:2019-07-23 18:37:42
【问题描述】:

我有以下实现归并排序的函数:

第一个函数是merge函数,第二个函数是mergeSort函数。

如输出所示,当数组 [-3,8] 进入合并函数时,它似乎被反转为 [8,-3],从而无法进行排序。

  • 输入数组是int array[5] = {37, 45, 29, 8, -3};

  • 预期的输出将是:Sorted Array: -3 8 29 27 45

...

合并:... ||arr1: 8 || arr2:-3 -------- 新:-------- -3 8

合并:... ||arr1: 29 || arr2:8 -3 -------- 新:-------- 8 -3 29

合并:... ||arr1: 37 45 || arr2:29 8 -3 -------- 新:-------- 29 8 -3 37 45

排序数组:29 8 -3 37 45

合并:

int * ArraySort::merge(int arr1[], int arr1_size, int arr2[], int arr2_size){

    std::cout<<"\nMerging: ... ";
    int * new_array = new int [arr1_size+arr2_size];
    int i = 0, j = 0, k = 0;

    std::cout<<"||arr1: ";
    for(int i=0;i<arr1_size;i++)
        std::cout<<arr1[i]<<" ";

    std::cout<<"|| arr2: ";
    for(int i=0;i<arr2_size;i++)
        std::cout<<arr2[i]<<" ";


    while(i<arr1_size && j<arr2_size){
        if(arr1[i] < arr2[j]){
            new_array[k++] = arr1[i++];
        }
        else{
            new_array[k++] = arr2[j++];
        }
    }

    //    Clean up
    while(i<arr1_size){
        new_array[k++] = arr1[i++];
    }
    while(j<arr2_size){
        new_array[k++] = arr2[j++];
    }

    std::cout<<"\n -------- NEW: -------- ";
    for(int i=0;i<arr1_size+arr2_size;i++)
        std::cout<<new_array[i]<<" ";
    std::cout<<"\n";

    return new_array;
}

合并排序:

int * ArraySort::mergeSort(int * arr, int size){
    std::cout<<"\n\nMerge Sort...\n";
    std::cout<<"ON: ";
    for(int i=0;i<size;i++){
        std::cout<<arr[i]<<" ";
    }

    if(size == 1)
          return arr;

    int mid = size/2;
    std::cout<<"\nMid:"<<mid;

    int * left = new int[mid];
    int * right = new int [size-mid];

    std::cout<<"\nLEFT: ";
    for(int i=0;i<mid;i++){
        left[i] = arr[i];
        std::cout<<left[i]<<" ";
    }
    std::cout<<"\nRIGHT: ";
    for(int i=mid;i<size;i++){
        right[i-mid] = arr[i];
        std::cout<<right[i-mid]<<" ";
    }
    mergeSort(left, mid);
    mergeSort(right, size-mid);

    return merge(left, mid, right, size-mid);
}

【问题讨论】:

  • 请不要发布图片!您可以将该文本复制到代码块中吗?另外,您的输入、预期输出和实际输出是多少?你做了什么调试,你发现问题出在哪里?
  • 听起来您可能需要学习如何使用调试器来单步调试您的代码。使用好的调试器,您可以逐行执行您的程序,并查看它与您期望的偏差在哪里。如果您要进行任何编程,这是必不可少的工具。进一步阅读:How to debug small programsDebugging Guide
  • 我看到的news 比deletes 多,你可能想解决这个问题。最好的解决办法是使用std::vector
  • @scohe001谢谢你的建议。我将您的建议应用于该问题。问题发生在数组 [-3,8] 即将合并数组 [29] 时。数组 [-3,8] 作为 [8,-3] 发送,导致合并失败。

标签: c++ arrays sorting merge mergesort


【解决方案1】:

您的 mergeSort 函数返回 int *,它在递归模式下被忽略。 当您在同一个函数中调用 mergeSort 时,返回值会丢失,并且永远不会获得新的合并数组以进行下一次比较。

替换这些拖线以修复 mergeSort 函数中的错误。

/* the problem is here, when the return values are ignored 
       the arrays are getting sorted but never actually updated */
    left = mergeSort(left, mid);
    right = mergeSort(right, size-mid);

整个函数

int * ArraySort::mergeSort(int * arr, int size){
    std::cout<<"\n\nMerge Sort...\n";
    std::cout<<"ON: ";
    for(int i=0;i<size;i++){
        std::cout<<arr[i]<<" ";
    }

    if(size == 1)
          return arr;

    int mid = size/2;
    std::cout<<"\nMid:"<<mid;

    int * left = new int[mid];
    int * right = new int [size-mid];

    std::cout<<"\nLEFT: ";
    for(int i=0;i<mid;i++){
        left[i] = arr[i];
        std::cout<<left[i]<<" ";
    }
    std::cout<<"\nRIGHT: ";
    for(int i=mid;i<size;i++){
        right[i-mid] = arr[i];
        std::cout<<right[i-mid]<<" ";
    }
    /* the problem is here, when the return values are ignored 
       the arrays are getting sorted but never actually updated */
    left = mergeSort(left, mid);
    right = mergeSort(right, size-mid);

    return merge(left, mid, right, size-mid);
}

输出

合并排序... 开:-3 合并:... ||arr1: 8 || arr2:-3 -------- 新:-------- -3 8

合并:... ||arr1: 29 || arr2:-3 8 -------- 新:-------- -3 8 29

合并:... ||arr1: 37 45 || arr2:-3 8 29 -------- 新:-------- -3 8 29 37 45

【讨论】:

  • 非常感谢 Bhaumik!这解决了一切!感谢您的回复!大有帮助!
猜你喜欢
  • 1970-01-01
  • 2014-04-03
  • 2016-02-04
  • 2018-06-25
  • 2013-07-27
  • 2012-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多