通过先递归的分解数列,再合并数列就完成了归并排序。 感觉归并排序的名字就是这么来的吧
在归并排序的基础上再加上一行代码便可以捎带把逆序数求出来
归并的含义是将两个以上的有序组合合成一个新的有序表。
以下是2路归并排序:
初始关键字:[3] [8] [2] [4] [1] [9] [6] [5]
一趟归并后:[3 8] [2 4] [1 9] [5 6]
二趟归并后:[2 3 4 8] [1 5 6 9]
三趟归并后:[1 2 3 4 5 6 8 9]
核心操作是将前后相邻的两个有序序列归并成一个有序序列。
维基百科有张GIF非常形象
对于原始的数组2,1,3,8,5,7,6,4,10,在整个过程执行的是顺序是途中红色编号1-20。虽然我们描述中说的是程序先分解,再归并,但实际过程是一边分解一边归并,前半部分分先排好序,后半部分再拍好,最后整个归并为一个完整的序列,途中的merge过程它所在层的两个序列的merge过程:下图展示了每个merge过程对作用于数组的哪部分(红色)。