c++ - Trying to understand merge sort program
问题描述
I am trying hard to understand merge sort program.In order to understand I wrote this program but fails to understand the output. It would be very helpful if someone explain the output. I have understood only till mid=0
.
#include <iostream>
using namespace std;
void check(int c, int d) {
cout << "C=" << c << " D=" << d << endl;
if (c < d) {
int mid = (c + d) / 2;
cout << "mid=" << mid << endl;
check(c, mid);
check(mid + 1, d);
}
}
int main() {
// int a[12] = { 2, 3, 1, 6, 9, 112, 113, 224, 225, 226, 332, 2303 };
check(0, 5);
return 0;
}
Output:
C=0 D=5 mid=2 C=0 D=2 mid=1 C=0 D=1 mid=0 C=0 D=0 C=1 D=1 C=2 D=2 C=3 D=5 mid=4 C=3 D=4 mid=3 C=3 D=3 C=4 D=4 C=5 D=5
解决方案
请注意,这是基于自顶向下合并排序,这在学习中很流行,但大多数库都使用自底向上合并排序的变体。就输出而言,自上而下的归并排序会生成索引并将其推送到堆栈上,从而形成深度优先、左优先的排序。在生成 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
推荐阅读
- java - 我们可以将多个数据附加到缓冲输出流中吗?
- git - Phabricator:更新工作副本时出错:命令在运行更多后被超时杀死
- php - 在多个文件上传时调用成员函数 getClientOriginalName()
- javascript - 从其 hexAddress 访问 Buffer
- php - Laravel 的 Utf8 编码问题
- kotlin - 带有自签名证书的 ktor 客户端 https 请求
- python - 将数据帧 to_csv 文件缓冲区上传到 Google Cloud Storage 时出现 UnicodeError
- node.js - 希望使用 express-fileupload 上传多张图片
- python - 导入模块/功能的方法有哪些?
- reactjs - 注入 asyncReducers 时的 preloadedState