C++. Сортировка слиянием

219
03 марта 2017, 01:49

Вроде как алгоритм верный, но результат не выводит. Подскажите в чем проблема.

#include <iostream>
#include <vector>
#include <ctime>
using namespace std;
void mergeSort(vector<int> &vec, int start, int end)
{
    if(end - start < 2) return;
    if(end - start == 2)
    {
        if(vec[start] > vec[start + 1])
            swap(vec[start], vec[start + 1]);
        return;
    }
    mergeSort(vec, start, (end - start) / 2);
    mergeSort(vec, (end - start) / 2, end);
    vector<int> buffer;
    int begin1 = start, end1 = (end - start) / 2, begin2 = end1;
    while(buffer.size() < end - start) 
    {
        if((begin1 >= end1) || ( (begin2 < end) && (vec[begin2] <= vec[begin1]) ) )
        {
            buffer.push_back(vec[begin2]);
            begin2++;
        }
        else
        {
            buffer.push_back(vec[begin1]);
            begin1++;
        }
    }
    for(int i=start; i<end; i++)
        vec[i] = buffer[i - start];
}
int main()
{
    vector<int> vec;
    for(int i=0; i<10; i++)
        vec.push_back(i);
    srand(time(NULL));
    for(unsigned int i=0; i<vec.size(); i++)
        swap(vec[i], vec[rand() % (vec.size() - i) + i]);
    for(unsigned int i=0; i<vec.size(); i++)
        cout << vec[i] << " ";
    cout << endl;
    mergeSort(vec, 0, vec.size());
    for(unsigned int i=0; i<vec.size(); i++)
        cout << vec[i] << " ";
    cout << endl;
    return 0;
}
Answer 1

В трех местах нужно (end-start)/2 заменить на (end+start)/2:

mergeSort(vec, start, (end + start) / 2);
mergeSort(vec, (end + start) / 2, end);
vector<int> buffer;
int begin1 = start, end1 = (end + start) / 2, begin2 = end1;

Вам же нужна средина отрезка, а не половина его длины...

Answer 2

Проблема в том что он у тебя уходит в бесконечную рекурсию и у тебя заканчивается стек для хранения переменных и кидает SIGSEGV. Ну или работает очень долго и не завершается(зависит от размера стека).

вангую что ошибка где то в

mergeSort(vec, start, (end - start) / 2);
mergeSort(vec, (end - start) / 2, end);

рекомендую заменить end на size.(так будет лаконичней смотреться и легче дебажить)

То есть копай в сторону условия выхода из рекурсии.

READ ALSO
Проверка пароля по символьно на голом js

Проверка пароля по символьно на голом js

Необходимо сделать проверку пароля в режиме живого времени по каждому символуТ

215
Сравнение null vs object

Сравнение null vs object

Почему null === null // true ?

222