сортировка слиянием c исключением OOR UPD :: проблемы с выходом

При попытке сделать этот алгоритм сортировки слиянием с рекурсивными вызовами я получил исключение std :: out_of_range.

Я не знаю много об отладке и поиске причин ошибок. Ниже я опубликую код (не полный, только некоторые части) и исходный файл, содержащий тот же код (полная версия, конечно).

Я с удовольствием выслушаю предложения, даже если они не окажут никакой помощи в борьбе с этой ошибкой, поэтому не стесняйтесь комментировать этот код и подшучивать на меня 🙂

https://docs.google.com/file/d/0ByVN9ccAyFY2dkVLN0ZlTWVHZG8/edit

Основной функционал

int main()
{
vector<int> original;   //input vector
input (&original);      //write input to vector<int> original

divide(&original);      //pass the vector

for(unsigned int i=0;i<original.size();i++)//output the results
cout<<original.at(i);
}

Функция ввода

    int input(vector<int> *inVec) //read all input until non-integer
{
int tmp;
while (cin>>tmp)
inVec->push_back(tmp);
for(unsigned int i=0;i<inVec->size();i++)
cout<<inVec->at(i)<<endl;
}

Делить

int divide(vector<int> *original)
{
int origL=original->size();
if(origL>1)
{
vector<int> first;      //vectors for holding 2 halfs of "original"vector<int> second;     //

first.assign(original->begin(),original->begin()+origL/2);//1st half of "original"second.assign(original->begin()+origL/2+1,original->end());//2nd half

divide(&first);     //recursive call until "first" and
divide(&second);    //"second" include only one number

merge(&first,&second,original);//merge first and second back into one vector
}
}

Merge func

int merge(vector<int> *A,vector<int> *B,vector<int> *original)
{
//clear the original vector. we will use it to store sorted results.
original->erase(original->begin(),original->end());
unsigned int i=0,j=0;

//out the smallest number from A and B into
//original[0] and so on. This makes it a
//sorting algorithm.
for(i=0;i<A->size();i++)
{
if(j<B->size())
if(A->at(i)<=B->at(j))
original->push_back(A->at(i));
else{
original->push_back(B->at(j));
i--;j++;}
}
//the ABOVE loop scans whole vector A or B.
//if there are still uncopied elements in
//the other vector, then we check for them and
//push them into original.
if(j<B->size())
for(i=j;i<B->size();i++)
original->push_back(B->at(i));
if(i<A->size())
for(j=i;j<A->size();j++)
original->push_back(A->at(j));return EXIT_SUCCESS;
}

EDIT1:
Внесены изменения в MERGE, поэтому теперь нет ошибок времени выполнения. Однако вывод не верный. Если кто-то заметит, что может вызвать проблему, пожалуйста, сообщите мне. Тем временем я собираюсь попытаться найти это непосредственно.

-1

Решение

Что произойдет, когда у вас закончатся элементы в B в функции merge? ООК. Попробуйте тестовый случай, когда все элементы в B меньше, чем в A и только вызов слияния, чтобы увидеть, что я имею в виду.

Также это c ++, пожалуйста, используйте ссылку в предпочтении к указателям.

1

Другие решения

Существует ошибка в вашем сливаться функция, вы должны проверить, если какой-либо вектор В или вектор пуст, или доступ к векторам вызовет исключение.

0

Следующая часть неверна:

first.assign(original->begin(),original->begin()+origL/2);
second.assign(original->begin()+origL/2+1,original->end());

F.E. если у вас есть origL == 2, первый вектор будет {original [0]}, а второй вектор будет пустым. Вы должны переопределить заполнитель для второго вектора:

second.assign(original->begin()+origL/2,original->end())
0
По вопросам рекламы [email protected]