逆序對問題 O nlgn

2021-08-27 20:20:11 字數 1122 閱讀 1985

問題描述

在陣列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...