【问题标题】:Mergesort: Dynamically Allocating an Array with Size Known Only at Runtime合并排序:动态分配大小仅在运行时已知的数组
【发布时间】:2016-02-12 22:35:14
【问题描述】:

我正在学习算法课程,并试图在 C++ 中实现合并排序。我试图存储一个左右子数组,但意识到我无法这样做,因为我无法在运行时初始化大小。有没有办法解决这个问题,还是我的排序过程不正确?我在下面列出了我所拥有的。

我也尽量避免使用向量,因为那太明显太容易了。

void merge(int *arr, int left, int mid, int right)
{
    int size1 = mid - left + 1;
    int size2 = right - mid;

    int leftArr[size1];
    int rightArr[size2];
    ....

}
void mergeSort(int *arr, int left, int right)
{
    if (left < right)
    {
        int mid = (left + right) / 2;
        mergeSort(arr, mid+1, right);
        mergeSort(arr, left, mid);
        merge(arr, left, mid, right);
    }
}

【问题讨论】:

  • 尝试int *leftArr 并使用new []delete []。更好的是,熟悉std::vector。你用 C++ 编写代码,但这真的是 C。
  • 我也在尽量避免使用向量,因为这太明显太容易了。 -- 使用明显的东西有什么问题?使代码变得比应有的更难并不会赢得分数。
  • @PaulMcKenzie,不想让它变得更难。更多的学习经验。我知道向量是可能的,我绝对可以用向量来做到这一点。不幸的是,学校教育不是这样。必须了解教授希望它如何完成。
  • @AmiTavory,谢谢,我会试试的。 C 语法也与 C++ 非常相似。这确实是 C++。
  • 好吧,我们不知道你们学校想要什么。 C++ 中动态数组的明显答案是使用向量。此外,您仍然必须实现合并排序——使用向量仅有助于您不必担心泄漏或指针管理不善。使用向量不会神奇地为您创建合并排序功能。至于学习,为什么老师不让你创建一个动态数组类,然后在进一步的作业中使用它?

标签: c++ sorting merge mergesort


【解决方案1】:

在我看来,使用vector 会容易得多,这就是 C++。但是,如果您只是为了学习而这样做,那么您可以像建议的那样动态分配数组。

int *leftArr = new int[size1];
int *rightArr = new int[size2];

//do stuff

//don't forget to free your memory

delete [] leftArr;
delete [] rightArr;

【讨论】:

  • 可能没有问题,但是如果“do stuff”执行return,或者抛出异常,那么这是使用vector 的一个非常重要的原因——内存不会泄漏。
【解决方案2】:

可变长度数组的技术等价物使用 alloca 从堆栈中分配(名称可能不同),但不建议这样做,因为大数组会导致堆栈溢出。

     int * leftArr  = _alloca(size1*sizeof(int));
     int * rightArr = _alloca(size2*sizeof(int));

按照 user3886450 的回答中的建议使用 new 和 delete[]。

【讨论】:

    猜你喜欢
    • 2017-06-02
    • 2013-10-26
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 2011-01-03
    • 2014-04-18
    • 2010-10-18
    相关资源
    最近更新 更多