Mergesort:动态分配仅在运行时已知大小的数组

时间:2016-02-12 22:35:15

标签: c++ sorting merge mergesort

我正在学习算法类,并试图在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);
    }
}

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

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

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