【问题标题】:Main skipping over function?主要跳过功能?
【发布时间】:2016-09-10 17:32:38
【问题描述】:

我正在尝试通过一个免费的在线课程自学算法和数据结构的基础知识,因此,我认为它会让它在归并排序方面有所尝试。这实际上不会用于任何事情,所以它非常草率,但我似乎遇到了 main 没有调用 MergeSort 函数的问题。

输出是 00000000,(我假设是因为数组从未分配过任何东西)。当我通过 gdb 运行程序时,程序似乎到达了该行,然后完全跳过该函数并直接进入打印数组的循环。

有什么想法吗?我错过了什么愚蠢的东西吗?

#include <iostream>
using namespace std;

int *MergeSort(int array[], int sizeOf);

int main(){
    int numbers[8] = {5, 4, 1, 8, 7, 2, 6, 3};

    int *array = MergeSort(numbers, 8);

    for (int i = 0; i < 8; i++)
        cout << array[i];

return 0;

}

int *MergeSort(int array[], int sizeOf){

    int *leftArr = new int[sizeOf/2];       // Build arrays to split in half
    int *rightArr = new int[sizeOf/2];

    if (sizeOf < 2){                                     // Base case to end recursion
        return array;
    }

    else{

        for (int i = 0; i < (sizeOf/2); i++){ // Left gets first half
            leftArr[i] = array[i];
        }

        int j = (sizeOf/2) - 1;                          // Set point to start building 2nd

        for (int i = sizeOf; i >= (sizeOf/2); i--){
            rightArr[j] = array[i];                      // Build other half of array
            j--;
        }

        leftArr = MergeSort(leftArr, sizeOf/2);          // Call Recursive functions
        rightArr = MergeSort(rightArr, sizeOf/2);

    }

    static int *newArray = new int[sizeOf];     // Sorted array to Build
    int k = 0;                                                  // Iterators to build sorted func
    int m = 0;
    int p = 0;

    while (p < sizeOf){
        if (leftArr[k] < rightArr[m]){    // Left Arr's current value is less
            newArray[p] = leftArr[k];               // right arr's current calue
            k++;
        }
        else if (leftArr[k] >= rightArr[m]){
            newArray[p] = rightArr[k];
            m++;
        }
        p++;
    }

    //for (int i = 0; i < 8; i++)
    //  cout << newArray[i] << endl;

    return newArray;                // Return address to new array

}

【问题讨论】:

  • 停止假设并运行the debugger that came with your development environment中的程序。逐步执行程序并观察会发生什么。那你就肯定知道了。
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 好的。 @πάνταῥεῖ 对此的看法比我的更有礼貌。
  • 我试图通过 GDB 运行程序(如前所述),它实际上(似乎)跳过了对函数的调用......所以我想我不是完全假设,因为我已经尝试过调试器
  • @user4581301 实际上是为了礼貌而设计的。这是我正在使用的股票评论。

标签: c++ recursion mergesort


【解决方案1】:

您的MergeSort() 中有一个基本设计问题:

  • 您的算法是递归的(非常完美)
  • 不幸的是,它返回newArray,即static。这意味着所有调用都使用相同静态变量的相同实例(并覆盖递归调用返回的实例)。

您需要通过将 newArray 设为非静态来解决此问题。并且在函数的最后,需要delete[]递归调用返回的数组,以避免内存泄漏。

【讨论】:

  • 这是有道理的!谢谢!
猜你喜欢
  • 2012-02-16
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 2021-01-01
相关资源
最近更新 更多