归并排序归并

Merge sort mergin

本文关键字:归并 归并排序      更新时间:2023-10-16

我正在尝试实现归并排序。

我已经声明了合并函数

void mergeSort( vector<int> &a  , int low , int high){
    if( low < high){
        int mid = (low + high ) / 2;
        mergeSort( a  , low , mid);
        mergeSort( a , mid + 1 , high);
        mergeArays( a , low , mid , high);
    }
}

但是我在合并时有麻烦,我已经声明了

void mergeArays( vector<int> &a , int low , int mid , int high){
    int i = 0;
    int j = mid + 1;
    vector<int> final;
    while( i != mid && j!= high){
        if( a[i] < a[j]){
            final.push_back(a[i++]);
            continue;
        }
        final.push_back(a[j++]);
    }
    for( int i = 0; i < final.size() ;i++){
        a[i] = final[i];
    }
}

输入9 8 7 6 5 4 3 2 1,它抛出完全错误的输出。哪里是一个错误或错误在我的逻辑背后合并?我找不到它,每次我试着计算它,它应该是好的。

谢谢

您的mergeArrays方法中有一个错误。考虑这个循环:

while( i != mid && j!= high){
    if( a[i] < a[j]){
        final.push_back(a[i++]);
        continue;
    }
    final.push_back(a[j++]);
}

现在,假设您正在合并包含两个元素的子数组。这些都是:

[3,9]    // a[i] = 3, a[i+1] = 9
[10,12]  // j[i] = 10, j[i+1] = 12

所以根据你的代码,它将输出3和9,然后循环将退出,因为i == mid

你需要在循环结束后进行清理,以确保所有内容都被复制。正确的代码应该是:

while( i != mid && j!= high){
    if( a[i] < a[j]){
        final.push_back(a[i++]);
        continue;
    }
    final.push_back(a[j++]);
}
while (i != mid)
{
    final.push_back(a[i++]);
}
while (j != high)
{
    final.push_back(a[j++]);
}

注意,只会进入两个清理循环中的一个,因为要退出第一个循环,要么是i == mid,要么是j == high