合并排序mergin

时间:2016-08-14 22:20:37

标签: c++ algorithm mergesort

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

我已声明合并功能

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,它会输出错误的输出。合并后我的逻辑中的错误或错误在哪里?我没有找到它,每次我试图计算它应该是好的。

由于

1 个答案:

答案 0 :(得分:1)

您的mergeArrays方法中存在错误。考虑循环:

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

现在,假设您正在合并2元素子阵列。那些是:

[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 == midj == high