關於逆序對的三種解法


今天學習了逆序對,關於逆序對的三種解法做一個介紹,方便復習。

什么是逆序對?

設 A 為一個有 n 個數字的有序集 (n>1),其中所有數字各不相同。
如果存在正整數 i, j 使得 1 ≤ i < j ≤ n 而且 A[i] > A[j],則 <A[i], A[j]> 這個有序對稱為 A 的一個逆序對。
 
逆序對的解法
 
第一種:冒泡法(暴力)
直接對原序列進行冒泡排序,統計交換次數,得到的交換次數=逆序對數。
 
第二種:歸並排序
對原序列進行歸並排序,在每次合並兩數組時可以直接統計逆序對的個數。針對左有序序列中的第i號元素,和右有序序列中的第j號元素,若存在 a[j] < a[i] ,則a[i]后的所有
元素都大於a[j]。這種情況下 逆序對的個數result = mid - i + 1
 
第三種:離散化 + 樹狀數組
先利用離散化,一次性讀入所有數據,然后記錄讀入數據的下標和值,按照值的大小對值和下標進行排序。得到新的數據后,建立以新的值(排序的序號)為下標的樹狀數組,樹狀數組的值為當前狀態下該位值出現的次數。在每次向樹狀數組插入元素時,都利用樹狀數組查詢比當前插入元素的值更大的元素出現的個數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM