合并排序 C++ - 程序的奇怪行为

Merge sort in C++ - strange behavior of a program

本文关键字:程序 排序 C++ 合并      更新时间:2023-10-16

更新:合并函数中的修改条件,现在一切正常

我正在尝试在 c++ 中实现一种与 intege 向量一起使用的合并排序算法。所以这是我的代码段:

#include <vector>
#include <iostream>
using namespace std;
void Vout (vector <int> V){
    for (int i = 0; i<V.size(); i++)
        cout << V[i] << "t";
    cout << endl;
}
vector <int> merge (vector <int> B, vector <int> C){
    vector <int> D;
    int n = B.size() + C.size();
    int i=0, j=0;
    for (int k = 0; k<n; k++){
        if( ( B[i]<C[j] || j == C.size() ) && i<B.size() ){  //was like this: if( B[i]<C[j] ){
            D.push_back(B[i]);
            i++;
        }
        else{
            D.push_back(C[j]);
            j++;
        }
    }
    return D;
}
vector <int> merge_sort(vector <int> A){
    int n = A.size();
    if (n<=1) return A;
    vector <int> B, C;
    for (int i = 0; i<n/2; i++)
        B.push_back(A[i]);
    for (int i = n/2; i<n; i++)
        C.push_back(A[i]);
    B = merge_sort(B);
    C = merge_sort(C);
    vector <int> D = merge(B, C);
    return D;
}

int main() {
    vector <int> data;
    freopen("input.txt", "rt", stdin);
    int n;
    while (cin >> n){
        data.push_back(n);}
    Vout (data);
    Vout (merge_sort(data));
}

但是有了这个输入

5 4 6 7 9 1 2 8 3 12 10

它给出以下输出:

1 2 3 0 4 5 6 7 8 9 0

我不太明白所有这些零是从哪里来的。请帮忙。

你的merge()函数不能处理BC向量的末尾;当它到达任何一个向量的末尾时,你的比较(B[i]<C[j])将与数组末尾的比较进行比较。

我修改了下面给出的合并函数,它起作用了。

vector <int> merge (vector <int> B, vector <int> C){
    vector <int> D;
    int n = B.size() + C.size();
    int i=0, j=0;
    for (int k = 0; k<n; k++){
        if(B[i]<C[j]){
            D.push_back(B[i]);
            i++;
            if(i == B.size())
                break;
        }
        else{
            D.push_back(C[j]);
            j++;
            if(j == C.size())
                break;
        }
    }
    if(i == B.size())
    {
        while(j < C.size())
            D.push_back(C[j++]);
    }
    if(j == C.size())
    {
        while(i < B.size())
            D.push_back(B[i++]);
    }
    return D;
}