归并排序根据分离和合并是否是在一个递归函数中分成两类。
第一种:
只写一个递归函数。
这个函数的结构是:
void p(旧数组,新数组,左边界,右边界)
{
1 递归终止条件:左边界==右边界
2 求中间位置
3 根据中间位置划分
p(新数组,旧数组,左边界,中间位置);
p(新数组,旧数组,中间位置+1,右边界);
4 合并过程
合并过程包含循环过程和两数组不相等时的后续处理
}
这种写法需要在递归中将新旧数组换位置
参考题目: 剑指offer 数组中的逆序对
第二种:
写一个分离递归函数和合并函数。合并函数嵌套在分离函数中
分离函数:
p(数组,左边界,右边界)
{
1 递归终止条件
2 求中间位置
3 根据中间位置划分
p(新数组,左边界,中间位置);
p(新数组,中间位置+1,右边界)
4 合并函数M
m(数组,左边界,中间位置,右边界)
}
合并函数:
m(数组,左边界,中间位置,右边界)
{
1 求左边和右边的数组大小
2 建立两个数组,分别拷贝左右两个数组
3 合并过程 这个过程可以将后续处理写到一个循环中去
}
参考leetcode 493 reverse pairs