Есть проб. многочисленные вещи не так. Это показывает, как это можно сделать с помощью std::list
. Я не знаю, был ли задан API, но давайте сделаем его отдельной функцией, которая принимает список.
template<typename T>
void mergesort( std::list<T>& list ){
Работать можно только в том случае, если у нас более одного элемента
auto const size = list.size();
if( size > 1) {
Затем список делится на два списка.
auto mid = list.begin();
std::advance( mid, size/2 );
std::list<T> other;
other.splice( other.begin(), list, list.begin(), mid );
Теперь, когда у нас есть два подсписка, слияние может быть вызвано для них рекурсивно.
mergesort( list );
mergesort( other );
Затем необходимо объединить частичные результаты.
list.merge( other );
И мы закончили. Смотри рабочую версию здесь