c++递归归并排序程序停止工作
C++ recursive merge sort program stop working
我试图实现归并排序,但我不能得到它的工作。看来这个mergesort
部件确实有问题。这是:
void mergesort(std::vector<int> &vec)
{
int n = vec.size();
if (n == 1) return;
else {
std::vector<int> v1, v2;
for (int i = 0; i != n; ++i) {
if (i <= n / 2)
v1.push_back(vec[i]);
else
v2.push_back(vec[i]);
}
mergesort(v1);
mergesort(v2);
merge(vec, v1, v2);
}
}
这里是完整的源代码:
#include <iostream>
#include <vector>
#include "time.h"
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/uniform_int_distribution.hpp>
void merge(std::vector<int> &vec, std::vector<int> &v1, std::vector<int> &v2)
{
int n = vec.size();
vec.clear();
std::vector<int>::iterator it1 = v1.begin();
std::vector<int>::iterator it2 = v2.begin();
while (it1 != v1.end() && it2 != v2.end()) {
if (*it1 < *it2) {
vec.push_back(*it1);
++it1;
}
else {
vec.push_back(*it2);
++it2;
}
}
if (it1 != v1.end() && it2 == v2.end()) {
for (; it1 != v1.end(); ++it1) {
vec.push_back(*it1);
}
}
if (it1 == v1.end() && it2 != v2.end()) {
for (; it2 != v2.end(); ++it2) {
vec.push_back(*it2);
}
}
}
void mergesort(std::vector<int> &vec)
{
int n = vec.size();
if (n == 1) return;
else {
std::vector<int> v1, v2;
for (int i = 0; i != n; ++i) {
if (i <= n / 2)
v1.push_back(vec[i]);
else
v2.push_back(vec[i]);
}
mergesort(v1);
mergesort(v2);
merge(vec, v1, v2);
}
}
int main()
{
const int size = 3;
const int range = 1000;
boost::random::mt19937 gen;
gen.seed(time(0));
boost::random::uniform_int_distribution<> dist(1, range);
std::vector<int> vec;
std::cout<<"Origin: "<<std::endl;
for (int i = 0; i != size; i++) {
vec.push_back(dist(gen));
std::cout<<vec[i]<<" ";
}
std::cout << std::endl;
mergesort(vec);
std::cout<<"Sorted: "<<std::endl;
for (auto it = vec.begin(); it != vec.end(); ++it) {
std::cout<<*it<<" ";
}
return 0;
}
还有输出:
Origin:
654 356 895
然后它警告我它停止工作了。
那么我哪里做错了,如何修复它?
问题是:
void mergesort(std::vector<int> &vec)
{
int n = vec.size();
if (n == 1) return;
else {
std::vector<int> v1, v2;
for (int i = 0; i != n; ++i) {
if (i <= n / 2)
v1.push_back(vec[i]);
else
v2.push_back(vec[i]);
}
mergesort(v1);
mergesort(v2);
merge(vec, v1, v2);
}
}
内部循环应该是这样的:
for (int i = 0; i != n; ++i) {
if (i <= (n - 1) / 2)
v1.push_back(vec[i]);
else
v2.push_back(vec[i]);
}
在这个计算中,我们需要最后一个元素的索引,并且n是索引为0的数组的元素个数,因此:
(n - 1) / 2
相关文章:
- C++程序工作,但 Windows 显示"程序.exe已停止工作"
- 程序 使用链表插入数据时停止工作
- 当我尝试输入时程序停止工作
- 由于程序停止工作,生成大量数字失败
- 该程序在执行时停止工作.我在代码块中制作了这个程序
- 为什么我的程序在输入main()之前停止工作
- C++程序在 freopen 中读取大文本后停止工作
- 无限循环使程序停止工作
- 当运行程序时,它说程序.exe停止工作
- 我的程序在执行期间停止工作
- 程序在尝试将 file.read() 文件() 到新变量时停止工作
- 为什么这是为了使程序停止工作?(C )
- 我的C 程序已经停止工作
- 快速排序程序停止工作
- C++程序已停止工作
- 程序停止工作由 strcat() 与指针
- 在 Cout << "hello" << endl 中删除 endl 后,我的C++程序停止工作
- C++使用Qt库的应用程序在屏幕保护程序启动时停止工作
- 制作大桌子时程序停止工作 (2'000'000+)
- 从文件 C++ 程序读取停止工作