問題描述
笨方法:O(n2)
分治O(nlogn)
1)將數組分成兩半,分別求出左半邊的逆序數和右半邊的序數
2)再算有多少逆序是由左半邊去一個數和右半邊取一個數構成(要求O(n)實現)
解決關鍵:左半邊和右半邊都是排好序的.比如,都是從大到小排序的,這樣,左右半邊只需要從頭到尾各掃一遍,就可以找出由量變各取一個數構成的逆序個數
下圖是上面2)的圖示
首先在排好序后,我們可以得到在本組內,逆序數的個數,然后左右各掃一遍,如上圖,如果i<j,那么i后面的書也小于j,肯定不能構成逆序數,j++,當j=5時,i>j,i往后走i++,一直到3,此時不構成,j++,i=3,j=2,構成逆序數,所以得出上述2)中的情況
總結
由歸并排序改進得到,加上計算逆序的步驟
MergeSortAndCount:歸并排序并計算逆序數