劍指offer 逆序對

2022-08-20 15:00:25 字數 1379 閱讀 3327

這道題隱含的思想是二分法和歸併排序。

class

solution

long

long inversepairscore(vector &data,vector ©,int start,int

end)

int length=(end-start)/2

;

long

long left=inversepairscore(copy,data,start,start+length);

long

long right=inversepairscore(copy,data,start+length+1

,end);

int i=start+length;

int j=end;

int indexcopy=end;

long

long count=0

;

while(i>=start&&j>=start+length+1

)

else

}for(;i>=start;i--)

copy[indexcopy--]=data[i];

for(;j>=start+length+1;j--)

copy[indexcopy--]=data[j];

return left+right+count;

}};

交換copy和data是因為:

1.在每次的操作中,數值的比較都是採用當前傳入函式中第一項,也就是data;比較的結果都存放到copy中;也就意味著此時copy中是經過此次呼叫的結果。

2.從最底層返回時,進入了(start == end)的情形,data 和 copy 完全沒有修改,此時copy和data還是一樣的。

3.進入倒數第二層時,程式進入上圖26行以後部分,copy是部分排序後的新陣列,data是舊陣列。注意這裡都是傳值的呼叫,陣列都是直接修改的。

倒數第二層使用的copy其實是倒數第三層中的data,這就確保了倒數第三層進入26行以後時,資料比較使用的data是最新排序的陣列。

4. 倒數第三層將排序的結果存入copy中。程式在倒數第四層進入26行後,使用的data陣列為剛剛倒數第三層中的最新排序的copy.

5. 也就是說,在每次程式進入26行時,此時的data是最新的排序結果,copy是次新的結果。

在最後一次進入26行以後時,copy為完整排序後的結果,data是次新的結果。

然而這裡第乙個類內函式呼叫第二個函式時,data和copy的順序沒有改變,所以最後結果應該copy是完整排序的結果.data是差一步完成排序的結果。以輸入[7,5,6,4], 最後的結果copy[4,5,6,7], data[5,7,4,6].

劍指offer 陣列中的逆序對

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。解法一 乙個數字能不能構成逆序對,關鍵看後面有幾個比他小的數字。根據這個思路,我們可以從後向前遍歷整個陣列。並用乙個大小為10的陣列,分別來儲存從後向前遍歷陣列時0 9每個數字...

劍指offer系列 陣列中逆序對

題目描述 輸入乙個陣列,求出其中逆序對的總個數 示例 輸入 逆序對有,幾種情況 因此輸出5 分析 利用歸併排序的思想進行排序,時間複雜度o nlgn int inversepairscore vector nums,vector copy,int begin,int end int mid begi...

劍指offer 陣列中的逆序對

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。class solution vector tmp len int res mergesort data,tmp,0,len 1 return res private...