[英]Merge-Sort code implementation in C++
我正在嘗試使用向量和迭代器在C ++中實現合並排序。 該程序編譯良好,但是當我嘗試運行它時,它崩潰了。 我嘗試調試它,但沒有成功。
使用數組的實現很簡單,但是當我嘗試使用向量實現完全相同的算法時,程序將無法運行。
#include <iostream>
#include <vector>
#include <algorithm>
void mergesort(std::vector<int>& A, int l, int r);
void merge(std::vector<int>& A, int l, int m, int r);
void mergesort(std::vector<int>& A, int l, int r) {
if(l < r) {
int m = l + (r - l) / 2;
mergesort(A, l, m);
mergesort(A, m + 1, r);
merge(A, l, m, r);
}
}
void merge(std::vector<int>& A, int l, int m, int r) {
std::vector<int> L(A.begin() + l, A.begin() + (m - 1));
std::vector<int> R(A.begin() + m, A.begin() + r);
std::vector<int>::iterator i = L.begin();
std::vector<int>::iterator j = R.begin();
std::vector<int>::iterator k = A.begin() + l;
while(i != L.end() && j != R.end()) {
if(*i <= *j) {
*k = *i;
i++;
}
else {
*k = *j;
j++;
}
k++;
}
while(i != L.end()) {
*k = *i;
i++;
k++;
}
while(j != R.end()) {
*k = *j;
j++;
k++;
}
}
void print_vector(std::vector<int> A) {
std::vector<int>::iterator it;
for(it = A.begin(); it != A.end(); ++it) {
std::cout << *it << " ";
}
}
int main() {
std::vector<int> A = {178, 1156, 136, 5, 6, 7};
mergesort(A, 0, A.size() - 1);
print_vector(A);
}
在這個部分
if(l < r) {
int m = l + (r - l) / 2;
mergesort(A, l, m);
mergesort(A, m + 1, r);
merge(A, l, m, r);
}
當r = l + 1時,得到m = l,然后調用mergesort要求函數對空向量進行排序,而mergesort的代碼假定它不為空。
什么是
std::vector<int> L(A.begin() + l, A.begin() + (m - 1));
在這種情況下?
這應該是進行調試的良好起點。
問題在於函數void merge(std::vector<int>& A, int l, int m, int r)
vector
s L
和R
內存分配。
以下是經過糾正的代碼段,盡管未優化(您可以自由進行優化;)):
std::vector<int> L;
std::vector<int> R;
int n1 = m - l + 1;
int n2 = r - m;
if(n1 > 0)
{
for(int i=0; i<n1; i++) L.push_back(0);
std::copy(A.begin() + l, A.begin() + (l+n1), L.begin());
}
if(n2 > 0)
{
for(int i=0; i<n2; i++) R.push_back(0);
std::copy(A.begin() + (l+n1), A.begin() + (l+n1+n2), R.begin());
}
您可以在此處找到完整的工作代碼
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.