我正在尝试实现合并排序,但我无法让它工作。似乎这个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
然后它警告我它已经停止工作了。
那么我在哪里做错了以及如何解决它? 提前谢谢。
答案 0 :(得分:0)
问题在于:
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