前几天看树状数组,昨天做求逆序数的题,发现归并排序求逆序数更快一点,或者说是排序的时候顺便把逆序数给求了,于是学了一下,顺便整理一下。。。。。。
归并排序:说白了就是把一列数 递归 的分解为多个有序的子序列,然后再把子序列合并 为一列有序的数。
这就涉及两个过程:
1,递归划分:把序列分成个数尽量相等的两部分,两边的元素分别排好序;
2,合并求解:把两个有序表合成一个;
下面来说明上面两个过程:
第一步:假如给定一个序列:{3 9 1 2 5 6 7},第一次划分后分为两个子序列{3 9 1},{2 5 6 7},当然现在两边的序列依旧无序,现在我们要做的使序列有序(当然我们不能直接用排序函数直接对两部分排序,要不还要归并排序干嘛),那就继续第一步,把两个子序列继续递归分解,当递归到每个子序列中只包含一个元素时,呵呵,这个子序列当然就是有序的了,当第一步结束后我们得到如下七个子序列{3},{9},{1},{2},{5},{6},{7},并且每个子序列有序。
第二步:分别对两个有序子序列合并,对上面七个子序列第一次合并后是{3,9},{1,2},{5,6},{7},第二次合并后是{1,2,3,9},{5,6,7};第三次合并后就是{1,2,3,5,6,7,9},排序完成。
现在我们来说如何把两个有序子序列合并为一个有序序列:对序列1{1,2,3,9}和序列2{5,6,7};我们先比较序列1的第一个元素和序列2的第一个元素,小的元素存入序列3中