引言:二路归并排序采用把一个数组分割为单独的元素并且相邻两组合并的同时排序的方法进行数组的排序。具体的实现在任何一本数据结构书中都有描述,也不难理解。
今天我们来说说如何在归并的基础上,研究逆序对问题(给出完整C语言代码,已编译)
我们以【7,5,6,4】这个数组为背景
通过层层递归拆分为 【7】【5】【6】【4】四个单独的部分,然后采用二路归并(相邻两个进行合并且同时从小到大排序),得到【5,7】和【4,6】两个部分。然后继续二路归并得到【4,5,6,7】序列。
【注:在一次归并开始时,low指向左分区的第一个结点不变,i=low指向左分区第一个结点,mid指向左分区最后一个结点不变,j=mid+1,j指向右分区第一个结点,high指向右分区最后一个结点不变】
我们来分析上述过程的细节:其中 7,5进行排序时,i指针指向7,j指针指向5。我们心里把7 和5当作两个已经排好序的序列,所以当出现arr[i]>arr[j]的时候,也就是前面分区的某一项大于后面分区的某一项时,前面分区从第i项到分区最后一个数(mid)都会比这个a[j]大,所以类似人脑计算的模式,锁定这个小的数字,然后找有多少个比他大的数就行,因此