Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mergesort:动态分配只有在运行时才知道大小的数组 我正在使用一个算法类,并试图在C++中实现一个合并排序。我试图存储一个左右子阵列,但意识到我无法这样做,因为我无法在运行时初始化大小。有没有办法解决这个问题,或者我是不是在错误地处理排序过程?我在下面列出了我所拥有的_C++_Sorting_Merge_Mergesort - Fatal编程技术网

Mergesort:动态分配只有在运行时才知道大小的数组 我正在使用一个算法类,并试图在C++中实现一个合并排序。我试图存储一个左右子阵列,但意识到我无法这样做,因为我无法在运行时初始化大小。有没有办法解决这个问题,或者我是不是在错误地处理排序过程?我在下面列出了我所拥有的

Mergesort:动态分配只有在运行时才知道大小的数组 我正在使用一个算法类,并试图在C++中实现一个合并排序。我试图存储一个左右子阵列,但意识到我无法这样做,因为我无法在运行时初始化大小。有没有办法解决这个问题,或者我是不是在错误地处理排序过程?我在下面列出了我所拥有的,c++,sorting,merge,mergesort,C++,Sorting,Merge,Mergesort,我还试图避免向量,因为这太明显和容易了 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

我还试图避免向量,因为这太明显和容易了

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);
    }
}
void合并(int*arr,int-left,int-mid,int-right)
{
int size1=左中+1;
int size2=右-中;
int leftArr[size1];
国际右翼[size2];
....
}
无效合并排序(int*arr,int左,int右)
{
if(左<右)
{
int mid=(左+右)/2;
合并排序(arr,中间+1,右侧);
合并排序(arr、左、中);
合并(arr、左、中、右);
}
}

从我的角度看,使用<代码>向量会容易得多,这就是C++。但是,如果您只是为了学习而这样做,那么您可以像建议的那样动态分配数组

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

//do stuff

//don't forget to free your memory

delete [] leftArr;
delete [] rightArr;

技术上相当于使用alloca从堆栈分配可变长度数组(名称可能不同),但不建议这样做,因为大型数组将导致堆栈溢出

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

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

尝试
int*leftArr
并使用and
delete[]
。更好的是,熟悉你自己。您编写的代码是C++,但这是C。我也试图避免向量,因为这太明显和容易。使用显而易见的东西有什么不对?它不会通过使代码变得比应该的更难来赢得分数。@PaulMcKenzie,没有试图使代码变得更难。更多关于学习体验的信息。我知道用向量是可能的,我肯定能用向量做到。不幸的是,学校教育不是这样的。我得知道教授想怎么做。@AmiTavory,谢谢,我会试试的。C语法也非常类似于C++。这确实是C++。我们不知道你的学校想要什么。C++中动态数组的一个明显的答案是使用向量。此外,您还必须实现合并排序——使用vector只会有帮助,因为您不必担心泄漏或指针管理不当。使用vector并不能神奇地为您创建合并排序函数。至于学习,为什么老师不让你创建一个动态数组类,然后在以后的作业中使用它呢?这可能没有问题,但是如果“do stuff”返回
,或者抛出异常,那么这就是使用
vector
的一个非常重要的原因——内存不会泄漏。