在C 中合并代码实现

Merge-Sort code implementation in C++

本文关键字:代码 实现 合并      更新时间:2023-10-16

我正在尝试使用向量和迭代器在C 中实现合并。该程序可以很好地编译,但是当我尝试运行它时,它会崩溃。我尝试调试它,但没有成功。

使用数组实现的实现很直截了当,但是当我尝试使用向量实现完全相同的算法时,程序无法运行。

#include <iostream>
#include <vector>
#include <algorithm>
void mergesort(std::vector<int>& A, int l, int r);
void merge(std::vector<int>& A, int l, int m, int r);

void mergesort(std::vector<int>& A, int l, int r) {

    if(l < r) {
        int m = l + (r - l) / 2;
        mergesort(A, l, m);
        mergesort(A, m + 1, r);
        merge(A, l, m, r);
    } 
}
void merge(std::vector<int>& A, int l, int m, int r) {
   std::vector<int> L(A.begin() + l, A.begin() + (m - 1));
   std::vector<int> R(A.begin() + m, A.begin() + r);
   std::vector<int>::iterator i = L.begin();
   std::vector<int>::iterator j = R.begin(); 
   std::vector<int>::iterator k = A.begin() + l;
   while(i != L.end() && j != R.end()) {
       if(*i <= *j) {
           *k = *i;
           i++;
       }
       else {
           *k = *j;
           j++;
       }
       k++;
   }
   while(i != L.end()) {
       *k = *i;
       i++;
       k++;
   }
   while(j != R.end()) {
       *k = *j;
       j++;
       k++;
   }
}
void print_vector(std::vector<int> A) {
    std::vector<int>::iterator it;
    for(it = A.begin(); it != A.end(); ++it) {
        std::cout << *it << " "; 
    }
}

int main() {
    std::vector<int> A = {178, 1156, 136, 5, 6, 7};
    mergesort(A, 0, A.size() - 1);
    print_vector(A);
}

在本节中

if(l < r) {
    int m = l + (r - l) / 2;
    mergesort(A, l, m);
    mergesort(A, m + 1, r);
    merge(A, l, m, r);
} 

当r = l 1时,您会得到m = l,然后呼叫Mergesort,要求该函数对空置进行排序,而Mergesort代码则假定其不是空。

什么是

 std::vector<int> L(A.begin() + l, A.begin() + (m - 1));

在这种情况下?

这应该是进行调试的好起点。

问题是在函数void merge(std::vector<int>& A, int l, int m, int r)中的vector S LR的内存分配。

以下是校正的代码段,尽管未进行优化(您可以自由进行优化;):

std::vector<int> L;
std::vector<int> R;
int n1 = m - l + 1;
int n2 =  r - m;
if(n1 > 0)
{
   for(int i=0; i<n1; i++) L.push_back(0);
   std::copy(A.begin() + l, A.begin() + (l+n1), L.begin());
}
if(n2 > 0)
{
   for(int i=0; i<n2; i++) R.push_back(0);
   std::copy(A.begin() + (l+n1), A.begin() + (l+n1+n2), R.begin());
}

您可以在此处找到完整的工作代码