分治求逆序对数
用分治求逆序对数,其思想与归并排序差不多,具体的我们可以看一下伪代码
第一步还是把一个大的数组进行分割,直至不能再分为止,这样的话总的逆序对数就可以分为三部分,左边数组的逆序对数、右边数组的逆序对数、左右数组交叉形成的逆序数对数。所以最后的结果是把他们三个加起来。第一步的伪代码:
Count_Sort(A)
Divide A into two sub_array L and R
Lc=Count_Sort(L)
Rc=Count_Sort(R)
LR=Merge_Count(L,R)
return Lc+Rc+LR
第二部就是比较复杂的一步,类比归并排序,也是两个指针分别从左右两个数组中取元素进行比较,但是比暴力计算逆序对数去掉了很多冗余,因为左右数组都排好序的情况下,如果左边数组的一个元素a比右边数组的一个元素b大的话,那么在左边数组中,a后边的所有元素都要比b大,所以a后面的元素就不用和b再进行比较了。伪代码:
Merge_Count(L,R)
num=0,i=0,j=0
for k=0 to ||L||+||R||-1 do
if L[i]>R[j]
A[k]=R[j]
j++
num+=(||L||-i)
else
A[k]=L[i]
i++
end if
end for
return num
该算法的时间复杂度为
来源:CSDN
作者:Chauncy__xu
链接:https://blog.csdn.net/qq_44384577/article/details/103866332