C ++递归合并排序程序停止工作

时间:2014-03-15 09:55:47

标签: c++ sorting mergesort

我正在尝试实现合并排序,但我无法让它工作。似乎这个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

然后它警告我它已经停止工作了。

那么我在哪里做错了以及如何解决它? 提前谢谢。

1 个答案:

答案 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