归并排序
将数组不断的一分为2,直到不能拆分为止,然后再合并,合并成为一个有序的队列即可。
归并排序的思想非常简单,但是归并排序用与排序却非常少,因为他有另一个非常有用的特性,也就是他合并前,第一个数组中所有的元素初始下标,都比第二数组的下标小,也就决定了它可以解决一些特殊的难题
难题一:求逆序对的个数
逆序对解释:数组中nums[i] > nums[j] 且 i < j。
这个正好符合归并排序在合并2个数组时,第一个数组的元素的下标肯定小于第二个数组所有元素的下标,那么在排序过程中,对于第二个数组中的元素,你是很容易找到第一个数组中比你大的元素的数量。累加这些数量就是返回结果。
难题二:区间和的个数
区间和:数组从下标 i 到 j 的元素之和。
这种题一般是求:区间和大小在某个范围内,这样的区间和有多少。
票眼一看,这和归并排序没半毛钱关系啊?
但是,区间和可以换一个视角,区间和[i,j] 就是前缀和 sum[j] - sum[i]( j > i)
好吧,这里就又设计到前后下标的事情了。
思路直接转换为:
2个已经排序好的数组,求第二个数组中的元素,减去第一个数组中元素,范围在规定范围内的对数有多少,这个就相对容易多了
其他还有类似的题目,只有涉及到前后下标元素之间的计算,你就可以尝试一下归并排序时候有用。
有时候线段树和树状数组可以用的情况,也可以尝试用归并排序处理。往往归并排序效率会更好