Я работаю над реализацией merge-sort, которая сортирует список песен по их длине. Я написал следующее и не смог исправить недостаток в своей логике. Вместо того, чтобы возвращать отсортированный список, эти функции возвращают список из одного элемента из середины исходного списка.Ошибка слияния логики сортировки при распределении памяти.
vector<song> merge(vector<song> firstList, vector<song> secondList){
vector<song> outPut;
int i = 0; int n = 0;
while(outPut.size() < (firstList.size() + secondList.size()-1)){
if(firstList[i].length < secondList[n].length){
outPut.push_back(firstList[i]);
i++;
}else{
outPut.push_back(secondList[n]);
n++;
}
}
return outPut;
}
vector<song> mergeSortLength(vector<song> playlist){
int scope = playlist.size()/2;
vector<song> firstHalf(&playlist[0], &playlist[scope]);
vector<song> secondHalf(&playlist[scope], &playlist[playlist.size()]);
if (firstHalf.size() != 1){
firstHalf = mergeSortLength(firstHalf);
}
if (secondHalf.size() != 1){
secondHalf = mergeSortLength(secondHalf);
}
return merge(firstHalf, secondHalf);
}
Если изменить состояние в то время как петли от
(outPut.size() < (firstList.size() + secondList.size() -1)){
в
(outPut.size() < (firstList.size() + secondList.size())){
он получает примерно на полпути, хотя список сортировки успешно, пока компилятор не выплевывает:
playList(27898,0x7fff78b7b000) malloc: * mach_vm_map(size=7526769998340063232) failed (error code=3) * error: can't allocate region *** set a breakpoint in malloc_error_break to debug libc++abi.dylib: terminating with uncaught exception of type std::bad_alloc: std::bad_alloc Abort trap: 6
I r зная, что кто-то помогает. Мои глаза неловко смотрят на это.
Сравните свой код с [сортировка слиянием реализована здесь] (http://stackoverflow.com/questions/24650626/how-to-implement-classic-sorting-algorithms-in-modern-c) – PaulMcKenzie
И здесь [малый тест] (http://ideone.com/L11iM6). Я предлагаю вам взять код, который вы видите по ссылке, взять свой код и тщательно отлаживать, где не работает ваш код, и где хороший пример не подводит. Похоже, вы пытаетесь подражать 'std :: inplace_merge', и вы ошибаетесь. [Вот еще одна ссылка] (http://en.cppreference.com/w/cpp/algorithm/inplace_merge) с примером. – PaulMcKenzie
Спасибо за подсказку. Я сравню, и я дам вам знать, если это поможет. –