Обратите внимание, что это основано на сортировке слиянием сверху вниз, которая популярна для обучения, но большинство библиотек используют вместо этого сортировку слиянием снизу вверх. Что касается выходных данных, сортировка слиянием сверху вниз генерирует и помещает индексы в стек, что приводит к упорядочению по глубине в первую очередь, слева вначале. Объединение не происходит до тех пор, пока не будут произведены 2 прогона размером 1 Я изменил код, чтобы показать уровень рекурсии l , и если рекурсивный вызов был первым или вторым x :
#include <iostream>
using namespace std;
void check(int c, int d, int l, int x) {
if(c >= d){
cout << "l = " << l << " x = " << x;
cout << " c = " << c << " d = " << d << endl;
return;
}
int m = (c + d) / 2;
cout << "l = " << l << " x = " << x;
cout << " c = " << c << " m = " << m << " d = " << d << endl;
check(c, m, l+1, 1);
check(m + 1, d, l+1, 2);
}
int main() {
check(0, 5, 0, 0);
return 0;
}
Это вывод:
l = 0 x = 0 c = 0 m = 2 d = 5
l = 1 x = 1 c = 0 m = 1 d = 2
l = 2 x = 1 c = 0 m = 0 d = 1
l = 3 x = 1 c = 0 d = 0
l = 3 x = 2 c = 1 d = 1
l = 2 x = 2 c = 2 d = 2
l = 1 x = 2 c = 3 m = 4 d = 5
l = 2 x = 1 c = 3 m = 3 d = 4
l = 3 x = 1 c = 3 d = 3
l = 3 x = 2 c = 4 d = 4
l = 2 x = 2 c = 5 d = 5