今天學習了逆序對,關於逆序對的三種解法做一個介紹,方便復習。
什么是逆序對?
設 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
第三種:離散化 + 樹狀數組
先利用離散化,一次性讀入所有數據,然后記錄讀入數據的下標和值,按照值的大小對值和下標進行排序。得到新的數據后,建立以新的值(排序的序號)為下標的樹狀數組,樹狀數組的值為當前狀態下該位值出現的次數。在每次向樹狀數組插入元素時,都利用樹狀數組查詢比當前插入元素的值更大的元素出現的個數。