題目描述
有一組數,對於其中任意兩個陣列,若前面乙個大於後面乙個數字,則這兩個數字組成乙個逆序對。
請設計乙個高效的演算法,計算給定陣列中的逆序對個數。
給定乙個int陣列a和它的大小n,請返回a中的逆序對個數。保證n小於等於5000。
測試樣例:
[1,2,3,4,5,6,7,0],8
返回:7
(一)、時間複雜度為o(n^2)
public
intcount(int a, int n)
}return result;
}
(二)、時間複雜度為o(nlogn)
1、歸併排序的定義如下:
分而治之(divide - conquer);每個遞迴過程涉及三個步驟
第一, 分解: 把待排序的 n 個元素的序列分解成兩個子串行, 每個子串行包括 n/2 個元素.
第二, 治理: 對每個子串行分別呼叫歸併排序mergesort, 進行遞迴操作
第三, 合併: 合併兩個排好序的子串行,生成排序結果.
2、在歸併排序中進行合併時,通過比較大小,可計算出兩個子串行可形成多少個逆序對。
public
class
shuzuzhongdenixvdui
return mergesortrecursion(a, 0, n - 1);
}/**
* 遞迴實現歸併排序
**@param arr
*@param l
*@param r
*@return 返回陣列中的逆序對
*/public
static
intmergesortrecursion(int arr, int l, int r)
int mid = (l + r) / 2;
return mergesortrecursion(arr, l, mid) + mergesortrecursion(arr, mid + 1, r) + merge(arr, l, mid, r);
}/**
* 合併兩個已排好序的陣列a[left...mid]和a[mid+1...right]
**@param arr
*@param left
*@param mid
*@param right
*@return 返回合併過程中累加逆序對
*/public
static
intmerge(int arr, int left, int mid, int right) else
}while (i <= mid)
while (j <= right)
for (int k = 0; k < temp.length; k++)
return inversenum;
}}
every story has an ending.but in life, every end is a new beginning.
陣列中逆序對
題目 在陣列中的兩個數字,如果前面的乙個數字大於後面的數字,則這兩個數字為乙個逆序對。輸入乙個陣列,求這個陣列的逆序對個數。例如 給定陣列 則有 5,3 5,1 8,3 8,1 3,1 這5個逆序對。問題分析 我採用兩種方法來解決這個問題 1 考慮到二叉搜尋樹中每個節點x,它的左子樹所有關鍵字的值小...
陣列中的逆序對
來自劍指offer 分析 我們第一反應是順序掃瞄整個陣列,每掃瞄到乙個數字時,逐個比較該數字和它後面的數字的大小。如果後面的數字比它小,則這個兩個數字就組成了乙個逆序對。假設陣列有n個數字,由於每個數字都要和o n 個數字作比較,因此這個演算法的時間複雜度為o n 2 換思路 我們採用歸併思想,先考...
陣列中的逆序對
題目 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。用歸併排序演算法,歸併的時候,從後向前歸併。include using namespace std int getreversenum int p1,int p2,int...