2.1.4 CountInversions
求一组数中的需要翻转的数的对数,其实就是求逆序对。
该问题最直接的方法,也是我最开始在leetcode上求解此题时,采用了2个嵌套的for循环进行比较即可,时间复杂度为O(n2),本质上是对一组数进行了遍历,在遍历的同时到底做了比较还是交换位置,都不影响遍历的这个过程。既然是遍历,我们可以采用快速排序和合并排序都是对数遍历然后进行处理,而quickSort和MergeSort为什么会降低时间复杂度:我们发现合并排序之所以能降低时间复杂度,是因为当左边的第一个数a与右边的第一个数b比较后,若左边的数比右边的数小,那么直接将左边的数a进vector,那边左边的数a就再也不需要和不会与右边的其他数进行比较的机会,为什么没有这个比较的机会了,从表面上看数a进vector;从本质上看数右边的数是已Sorted的,所以数a若比右边的第一个数还小,那么自然比右边的其他数都小,这也是为什么可以放心大胆的将数a与右边第一个数比较后直接进vector的原因,这也是基于分治思想的合并排序能够大大的减少比较的次数,从而减低时间复杂度的本质原因。
那么,求逆序对问题,其实就是将左边的数a与右边的数b进行比较,若左边的数比右边的数大,则构成一对逆序对,而左边的数是有序的,所以左边的数a后面的所有数自然比右边的数b大,那么在本次合并比较中,数a后面有多少数,就有多少逆序对。这样不需要将数a后面的数一一与数b进行比较就直接可以相减计算当前比较次数中有多少逆序对ÿ