演算法之逆序對

2021-09-20 01:20:57 字數 922 閱讀 5792

​ 假設a[1..n]是乙個有n個不同數的陣列。若ia[j],則對偶(i, j)稱為a的乙個逆序對(inversion)。

列出陣列的5個逆序對

由集合中的元素構成的什麼陣列具有最多的逆序對?它有多少逆序對?

插入排序的執行時間與輸入陣列中的逆序對的數量有什麼關係?

給出乙個求在n個元素的任何排列中逆序對數量的演算法,最壞時間複雜度為: \(\theta\)(nlgn)

根據定義易得,逆序對為:(2, 1)、(3, 1)、(8, 6)、(8, 1)、(6, 1)

當陣列元素恰好為n個元素從大到小排列時,擁有最多的逆序對。此時逆序對為: (n - 1) + (n -2) + (n - 3) + ... + 1 = n(n - 1) / 2

根據插入排序的實現過程,不難得出每次從未排序陣列選擇乙個值arr[j]插入已排序陣列的時候,所需要的移動次數,即為以arr[j]為右側值的逆序對的個數。這個特性也可以設計出乙個時間複雜度為: \(\theta\)(\(n^2\))的演算法。當然這種指數級別複雜度的演算法我們直接pass

不難想到\(\theta\)(nlgn)演算法複雜度的歸併排序。其實歸併排序在分治的時候不會改變逆序對的個數。只有在合併的時候,才會因為逆序對的出現導致右側提前被合入原陣列。其實修改點主要在兩個方面:

具體源**如下:

private static int count;

private static void merge(int arr, int startindex, int midindex, int endindex) else

}// step3

if (i < leftarr.length) else if (j <= rightarr.length)

}

黎明前最黑暗,成功前最絕望!

Java 演算法之求逆序對

逆序對問題 給定乙個陣列,如 8,8,3,0,6,8,9,3 前大後小的資料即為乙個逆序對,例如 8,3 3,0 求出這一陣列中的所有逆序對。思路 暴力法 設定雙重迴圈,數量標誌,比較兩兩之間的大小,符合逆序對標準則數量標誌 1,複雜度o n 2 本例中不考慮這個方法。合併排序 合併排序是將乙個陣列...

演算法之陣列中的逆序對

題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數 例如在陣列 7,5,6,4 中,一共存在5對逆序對,分別是 7,6 7,5 7,4 6,4 5,4 看 到這個題目,我們的第一反應就是順序掃瞄整個陣列。每掃瞄到乙個陣列的時...

演算法練習 逆序對

逆序對問題算是很經典了,最簡單的暴力破解時間複雜度o n2 時間複雜度大於o n2 的演算法是非常糟糕了,所以我們採用歸併排序的演算法改動一下,即可獲得o nlogn 的演算法。逆序對定義 數列中如果 i j arr i arr j 則arr i 和arr j 為一對逆序對。逆序對個數 privat...