我正在尝试实现合并排序。
我已声明合并功能
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
,它会输出错误的输出。合并后我的逻辑中的错误或错误在哪里?我没有找到它,每次我试图计算它应该是好的。
由于
答案 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 == mid
或j == high
。