【发布时间】:2022-01-01 20:42:51
【问题描述】:
我一直在学习归并排序算法,但遇到了一些麻烦。在我的实现中,输出中的某些数字丢失了,而其他数字则重复了。我正在使用向量并遵循 Cormen 等人在算法简介中描述的算法。人。和Geeksforgeeks。
代码如下:
#include <iostream>
#include <vector>
using namespace std;
void merge_sort(vector<int>&, int, int);
void merge(vector<int>&, int, int, int);
int main() {
vector<int> A = {5, 2, 4, 6, 1, 3};
int p = 0;
int r = A.size() - 1;
merge_sort(A, p, r);
for(int num : A)
cout << num << " ";
return 0;
}
void merge_sort(vector<int>&A, int p, int r){
if(p >= r)
return;
int mid = (p+r)/2;
merge_sort(A, p, mid);
merge_sort(A, mid+1, r);
merge(A, p, mid, r);
}
void merge(vector<int>&A, int p, int mid, int r){
int numLeft = mid - p + 1;
int numRight = r - mid;
//create two new vectors
vector<int> left;
vector<int> right;
//copy elements over
for(int i = 0; i < numLeft; i++)
left.push_back(A[i]);
for(int j = mid+1; j < (mid+1+numRight); j++)
right.push_back(A[j]);
//compare elements from the two arrays
int i = 0;
int j = 0;
int k = 0;
while(i < numLeft && j < numRight){
if(left[i] <= right[j]){
A[k] = left[i];
i++;
}
else{
A[k] = right[j];
j++;
}
k++;
}
//check if one half terminated before the other
while(i < numLeft){
A[k] = left[i];
k++; i++;
}
while(j < numRight){
A[k] = right[j];
k++; j++;
}
}
输出:1 2 3 6 1 3
【问题讨论】:
-
你用过调试器吗?