C ++ программа рекурсивной сортировки слиянием перестает работать

0

Я пытаюсь реализовать сортировку слияния, но я не могу заставить ее работать. Кажется, что эта часть 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
    Попробуйте изменить, если (n == 1) return; если (n <= 1) возврат;
  • 0
    Я попробовал это, но все еще не работает. @Abhishek Bansal
Теги:
sorting
mergesort

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню