合并排序算法:std::out_of_range

merge sort algorithm: std::out_of_range

我目前正在制作合并排序算法,但是当我 运行 代码时,我收到一条错误消息:“在抛出 'std::out_of_range 的实例后终止调用”。这是我的代码。

template<typename T>
void merge(std::vector<T> &vec, int l, int m, int r){
    int i = l;
    int j = m + 1;
    int k = l;
    
    //CREATE TEMPORARY MEMORY
    int temp[vec.size()];

    while(vec.at(i) <= m && j <= r){
        if(vec.at(i) <= vec.at(j)){
            temp[k] = vec.at(i);
            i++;
            k++;
        }else{
            temp[k] = vec.at(j);
            j++;
            k++;
        }
    }
    while (i <= m){ //first half: Copy the remaining elements of first half, if there are any
        temp[k] = vec.at(i);
        i++;
        k++;
    }
    while (j <= r){ //second half: Copy the remaining elements of second half, if there are any 
        temp[k] = vec.at(j);
        j++;
        k++;
    }
    for(size_t p = 1; p <= r; p++){ //copy temp array to original array
        vec.at(p) = temp[k];
    }
}

合并排序函数

template<typename T>
void mergeSort(std::vector<T> &vec, int l, int r){
    if(l < r){ 
        int m = (l + r) / 2; //find midpoint
        mergeSort(vec, l, m); //first half
        mergeSort(vec, m + 1, r); //second half
        merge(vec, l, m, r); // merge
    }
}

您的 merge 函数中的一些问题(您可以通过调试轻松发现):

  1. vec.at(i) <= mvalueindex 进行比较。这两者是无关的。所以改变:

    while(vec.at(i) <= m && j <= r){ 
    

    与:

    while(i <= m && j <= r){ 
    
  2. 最后一个循环以 p = 1 开始,这是一个在许多情况下超出合并范围的索引。所以改变:

    for(size_t p = 1; p <= r; p++){
    

    与:

    for(size_t p = l; p <= r; p++){
    
  3. 同一循环的主体使用 k 作为索引,但该变量与循环无关,并且具有超出正在考虑的范围的值。所以改变:

    vec.at(p) = temp[k];
    

    与:

    vec.at(p) = temp[p];
    

通过这些更改,您的代码将正常工作。

然而,遗憾的是temp总是有完整向量的大小,而你只使用它的一小部分。考虑减少内存使用量。