JZ35 陣列中的逆序對
阿新 • • 發佈:2021-08-30
JZ35 陣列中的逆序對
原題連結
<br//>
描述
在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007
對於50%50%的資料,size\leq 10^4siz**e≤104
對於100%100%的資料,size\leq 10^5siz**e≤105
示例
輸入:[1,2,3,4,5,6,7,0]
返回值:7
思路
歸併排序。排序的時候操作的是兩個子陣列a,b,遍歷兩個陣列如果發現 a 當前的數大於 b 當前的數,那麼說明a 中該數後面的數都大於 b 中的那個數,以此統計逆序對數。
解答
package com.klaus.sort; import org.junit.Test; public class MergeSort { int cnt = 0; public void merge(int[] a, int low, int high) { if (low < high) { // int mid = low + (high - low) / 2; int mid = (low + high) / 2; merge(a, low, mid); merge(a, mid + 1, high); sort(a, low, high, mid); } } public void sort(int[] a, int low, int high, int mid) { int i = low, j = mid + 1; int[] tmp = new int[high - low + 1]; int p = 0; // 兩邊相互比較 while (i <= mid && j <= high) { if (a[i] <= a[j]) { tmp[p++] = a[i++]; } else { tmp[p++] = a[j++]; cnt += (mid - i + 1);//就這個!!! } } // 把還沒比較完的直接放入tmp while (i <= mid) { tmp[p++] = a[i++]; } while (j <= high) { tmp[p++] = a[j++]; } p = 0; // 這是為什麼要儲存剛剛的 low、high for (int t = low; t <= high; t++) { a[t] = tmp[p++]; } } }
本文來自部落格園,作者:klaus08,轉載請註明原文連結:https://www.cnblogs.com/klaus08/p/15208008.html