c++递归归并排序程序停止工作

C++ recursive merge sort program stop working

本文关键字:停止工作 程序 归并排序 递归 c++      更新时间:2023-10-16

我试图实现归并排序,但我不能得到它的工作。看来这个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