利用分治的思想,实现子排序。同时将归并的思想应用于其他问题。
??归并排序的思路便是通过递归的思想,把一个排序问题分解为多个更小的排序问题。如对于一组序列,每次将这组序列对半分开,并分别以递归的方式对数组的前半部分和后半部分进行排序。最后通过归并动作将两个已经排好序的子序列合并,具体过程如下:
[5] [3] [1] [2] [7] [6] [8] [0]
[3? 5] [1 ?2] [6? 7] [0? 8]
[1? 2? 3? 5] [0? 6? 7? 8]
[0? 1? 2? 3? 5? 6? 7? 8]
??整个执行过程则是递归到序列长度为一,之后不断向上合并,直至合并成和原序列长度一致。在合并过程中,两边序列均已有序,因此每次可从两边的序列的最左边取一个最小值放入临时数组,之后对应的最小值所在序列下标往右移一位,直至两边全部元素移入临时数组,则临时数组是已经合并后的序列。每一层递归总合并操作时间复杂度为O(n)。每次二分,因此递归树深度为log2n,则归并排序时间复杂度为O(nlog2n)。
??归并排序可用于求一个序列的逆序对个数,所谓逆序对,则是指序列中的两个元素ai和aj,满足i < j的同时,ai > aj,则ai和aj就是一个逆序对。
??利用归并排序求逆序对,则是在合并时,通过左边序列和右边序列的比较,判断存在的逆序对数,因为两边序列均已有序,若存在右边元素比左边下标所在元素小,则所求的逆序对数目需要加上左边序列从当前下标到最后一个元素的元素个数,因为这些元素与右边序列的当前元素都满足逆序对。具体过程如下:
[3] [5] [1] [2] [7] [6] [8] [0]
[3? 5] [1 ?2] [6? 7] [0? 8] ?[7] [6]、[8] [0] 满足条件,此时逆序对数目为2
[1? 2? 3? 5] [0? 6? 7? 8] ?[3 5] [1]、[3 5] [2]、[6 7] [0]满足条件,此时逆序对数目为8
[0? 1? 2? 3? 5? 6? 7? 8] ?[1 2 3 5] [0]满足条件,此时逆序对数目为12
原文地址:https://www.cnblogs.com/idempotent/p/11620912.html