在C 中合并代码实现
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());
}
您可以在此处找到完整的工作代码
相关文章:
- gRPC 生成的代码缺少服务实现
- LLVM |如何实现逻辑非操作的 IR 代码生成
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 在实现合并排序代码时无法计算所有反转
- 如何实现此伪代码?
- 使用双LL在C++中实现Stack失败,出现异常"EXC_BAD_ACCESS(代码=2,地址=0x7fff5
- 如何减少大量包装类的实现代码?
- 如何以及在何处使用带QT的Basler Cam实现opencv人脸检测代码
- 实现在多线程代码中安全恢复的断点
- 与shared_ptr相比,更小的运行时数据结构和更快的代码可实现独特的_ptr
- 我们可以在层次结构中创建多个纯虚拟接口及其实现而不会代码爆炸吗?
- 为什么 C++ 代码实现的性能不比 python 实现更好?
- 在C 中合并代码实现
- 优化代码/实现"for"循环而不是长"if - else if - else"
- VTK r(重置)键代码实现
- 如何将.h文件中的代码实现到main.cpp文件中
- 在我的解释器上为脚本代码实现语法检查器的最佳方式是什么
- 使用c++代码实现图像的颜色切换
- 如何加快此代码实现的OpenCV
- 难以使用限时代码实现类 (C++)