程序員ioms 2021-09-18 03:44:35 阅读数:338
(3).代碼
簡化版
)2.逆序對
(1).介紹
上述提到歸並排序是穩定的排序,相等的元索的順序不會改變,進而用其可以解决逆序對的問題。首先我們了解一下什麼是逆序對。
逆序對:設 A為一個有n個數字的有序集(n>1),其中所有數字各不相同。如果存在正整數i,j使得1≤i<j≤n而且A[i]> A[j].則<A[i],A[j]>這個有序對稱為A的一個逆序對,也稱作逆序數。
例如,數組(3,1,4,5,2)的逆序對有(3,1),(3,2),(4,2),(5,2),共4個。
所謂逆序對的問題,即對給定的數組序列,求其逆序對的數量。
從逆序對定義上分析,逆序對就是數列中任意兩個數滿足大的在前,小的在後的組合。如果將這些逆序對都調整成順序(小的在前,大的在後),那麼整個數列就變得有序,即排序。因面,容易想到冒泡排序的機制正好是利用消除逆序來實現排序的,也就是說,交換相鄰兩個逆序數,最終實現整個序列有序,那麼交換的次數即為逆序對的數量。
冒泡排序可以解决逆序對問題,但是由於冒泡排序本身效率不高,時間複雜度為O(n^2),對於n比較大的情况就沒用武之地了。我們可以這樣認為,冒泡排序求逆序對效率之所以低,是因為其在統計逆序對數量的時候是一對一對統計的,而對於範圍為n的序列,逆序對數量最大可以是(n+1)*n/2,因此其效率太低.那怎樣可以一下子統計多個,而不是一個一個累加呢?這個時候,歸並排序就可以幫我們來解决這個問題。
在合並操作中,我們假設左右兩個區間元素為:
左邊:{3 4 7 9} 右邊:{1 5 8 10}
那麼合並操作的第一步就是比較3和1,然後將1取出來放到輔助數組中,這個時候我們發現,右邊的區間如果是當前比較的較小值,那麼其會與左邊剩餘的數字產生逆序關系,也就是說1和3、4、7、9都產生了逆序關系,我們可以一下子統計出有4對逆序對。接下來3,4取下來放到輔助數組後,5與左邊剩下的7、9產生了逆序關系,我們可以統計出2對。依此類推,8與9產生1對,那麼總共有4+2+1對。這樣統計的效率就會大大提高,便可較好地解决逆序對問題。
而在算法的實現中,我們只需略微修改原有歸並排序,當右邊序列的元素為較小值時,就統計其產生的逆序對數量,即可完成逆序對的統計。.
(2).代碼
版权声明:本文为[程序員ioms]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918034434915N.html