面試題29 陣列中的逆序對

2021-06-17 00:45:02 字數 1506 閱讀 6666

暴力方法:掃瞄陣列中的每個數,逐個比較該數字和其後面的數字的大小,若後面的數字比其小,則是乙個逆序對。

改進方法:先把陣列分割成子陣列,先統計出子陣列內部的逆序對數,然後再統計出兩個相鄰子陣列見的逆序對數。統計逆序對的過程中,需要對陣列進行排序。顯然排序過程是歸併排序。時間複雜度由o(n^2)降為o(nlogn),但需要o(n)的空間複雜度,是用空間換時間的做法。

//合併兩個排好序的陣列narr[nstart, nmid]和narr[nmid+1, nend]

void merge(int narr, int nstart, int nmid, int nend, int *ptemp, int &ncount)

else

}while (ncur1 >= nstart)

while (ncur2 >= nmid+1)

//將臨時陣列中的元素賦值到原陣列中

for (int i=nstart; i<=nend; i++) }

//歸併排序

void reverseordercount(int narr, int nstart, int nend, int *ptemp, int &ncount)

}//求陣列中的逆序對

int reverseordercount(int narr, int nlength)

//申請乙個長度相等的臨時陣列

int *ntemp = new int [nlength];

int ncount = 0;

reverseordercount(narr, 0, nlength-1, ntemp, ncount);

delete ntemp;

ntemp = null;

return ncount;

}//列印陣列中的逆序對數和排好序的陣列

void printmessage(int narr, int nlength)

{ cout << "逆序對的個數:" << reverseordercount(narr,nlength) << endl;

cout << "排好序的陣列:";

for (int i=0; i執行結果:

面試題 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對總數。例如嗎,在陣列中,一共存在5個逆序對,分別是 7,6 7,5 7,4 6,4 和 5,4 思路 作者給出的是基於歸併排序的一種演算法。那麼必然比暴力的o n 2 的好。如下 in...

面試題 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數p。並將p對1000000007取模的結果輸出。即輸出p 1000000007 1.如果對每乙個數字,依此查詢它前面的所有數字,複雜度為o n2 2.結合歸併排序的思想,複雜度為...

面試題36 陣列中的逆序對

題目 在陣列中的兩個數字如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。例如,有乙個陣列為array 0.n 其中有元素a i a j 如果 當ia j 那麼我們就稱 a i a j 為乙個逆序對。在陣列中一共存在5對逆序對,分別是 7,6 7...