陣列中的逆序對

2021-08-15 14:48:36 字數 1543 閱讀 9251

題目描述

有一組數,對於其中任意兩個陣列,若前面乙個大於後面乙個數字,則這兩個數字組成乙個逆序對。

請設計乙個高效的演算法,計算給定陣列中的逆序對個數。

給定乙個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...