1. 程式人生 > >歸並排序&&逆序對(codves1688,4163)

歸並排序&&逆序對(codves1688,4163)

如果 排序 範圍 eight 註意 sam def 序列 pad

歸並排序

歸並排序采用的是分治的思想

1、劃分問題:把序列分為元素個數盡量相等的兩半

2、遞歸求解:把兩半分別排序

3、合並問題:把兩個有序的序列合並為一個

對於第三個問題,我們可以從兩個序列中最小的元素開始比較,把較小的加入新的隊列中,直到某個序列為空,把另外的一個序列直接加入,然後將原來的序列覆蓋。其實很簡單,下面看看模板代碼

技術分享

 寫得爛,不要在意(⊙o⊙)…;

這個就是歸並排序(⊙o⊙)…,本人感覺很簡單的,歸並排序好像比sort,快排的復雜度低,也就是說快一點,是NlogN的復雜度。既然說了歸並排序,就不得不說下逆序對如codevs 1688 模板題

1688 求逆序對

題目描述 Description

給定一個序列a1,a2,…,an,如果存在i<j並且ai>aj,那麽我們稱之為逆序對,求逆序對的數目

!!!!!!數據範圍:N<=105。Ai<=105。時間限制為1s。//註意這裏範圍

輸入描述 Input Description

第一行為n,表示序列長度,接下來的n行,第i+1行表示序列中的第i個數。

輸出描述 Output Description

所有逆序對總數.

樣例輸入 Sample Input

4

3

2

3

2

樣例輸出 Sample Output

3

數據範圍及提示 Data Size & Hint        對於逆序對如果範圍小,可以用冒泡排序,交換一次ans++;最後排好了答案就出來了。但是冒泡排序是O(n^2)的復雜度,一看數據範圍是1e5 就知道要超時。所以就用歸並排序,來實現問題。其實只需要加一句代碼就行了 技術分享
       加上這句就完啦,最後輸出ans就可以了。     為什麽是加mid-q+1呢?

       我們在進行合並的時候是從小到大進行的,就是說,當把右段的數x放到臨時數組t中的時候,左段的數一定比x都大,有 mid-p+1個,這些數一定都和x成逆序對,因為他們的位置在x前,而值比x大。

      這就是逆序對的解法。

歸並排序&&逆序對(codves1688,4163)