問題描述
在陣列arr中,i < j , 如果 arr[i] > arr[j] 那麼就存在乙個逆序對
目的就是求出逆序對的數目。演算法
暴力求解,o(n^2);
下面運用了一種很巧妙的方法,通過歸併排序的歸併過程,進行逆序對的統計!
具體例子分析:
比如 1 5 3 2 4
當 1 3 5 與 2 4 合併的時候,
a. 1 < 2 , 所以1放入
b. 3>2 , 同理可得到3後面的元素也一定》2 ,所以逆序對 += 左邊的長度 - 3的下標
同理 , 5 > 4 , ...
在歸併的過程,完成了逆序對的統計,之所以可以這樣,歸併排序過程中,左邊的子集一定在右邊子集的前面,所以不用考慮先後
關係了,而且,元素都是排好序了的!
實現**
public class reversepair ;
rp.divide(arr, 0, arr.length - 1);
system.out.println(rp.pairs); }
private int pairs ;
// 歸併演算法的思想解決 逆序對
// 暴力方法求解的時候,就是對沒對元素比較 , o(n^2)
public void divide(int arr , int low , int high)
} private void merge(int arr, int low, int mid, int high)
t = 0;
for (int i = mid + 1 ; i <= high ; i++)
// 設定哨兵,要不你怎麼知道陣列所有元素已經合併了?
left[left.length - 1] = integer.max_value;
right[right.length - 1] = integer.max_value;
int llen = left.length;
int lt = 0 , rt = 0;
// 這裡不要 i = 0了!!
for(int i = low ; i <= high ; i++) else
} }}
逆序對問題 O nlgn
問題描述 在陣列arr中,i j 如果 arr i arr j 那麼就存在乙個逆序對 目的就是求出逆序對的數目。演算法 暴力求解,o n 2 下面運用了一種很巧妙的方法,通過歸併排序的歸併過程,進行逆序對的統計!具體例子分析 比如 1 5 3 2 4 當 1 3 5 與 2 4 合併的時候,a.1 ...
逆序對問題
逆序對問題。給一列數a1 a2,an 求它的逆序對數,即有多少個有序對 i j 使得 i j 但ai aj n 可以高達106 由於 n 的數量級到了106 所以採用o n2 及以上的時間複雜度肯定會超時,所以必須選取o nlog 2n 及以下時間複雜度的演算法。逆序對的求解思路和歸併排序很像,嘗試...
演算法導論2 4 O nlgn 時間複雜度求逆序對
給出乙個確定在n個元素的任何排列中逆序對數量的演算法,最壞情況需要o nlgn 時間 include include include int calculate int num,int l,int r return total int main int total calculate num,0,4...