归并排序归并
Merge sort mergin
我正在尝试实现归并排序。
我已经声明了合并函数
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
。
相关文章: