歸併排序 51nod 1019 逆序數

2021-07-31 23:05:29 字數 2452 閱讀 3198

後面的總結可能有錯誤的地方 發現請指出  畢竟 也是從別人呢裡搬的有 也有自己的總結!

1019 逆序數

基準時間限制:1 秒 空間限制:131072 kb 分值: 0 

難度:基礎題

在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。

如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數是4。給出乙個整數序列,求該序列的逆序數。

input

第1行:n,n為序列的長度(n <= 50000)

第2 - n + 1行:序列中的元素(0 <= a[i] <= 10^9)

output 1

輸出逆序數
input示例

424

31

output示例

4
#include#includeusing namespace std;

int a[100001],c[100001];

int sum=0;

void merges(int l,int mid,int r)

else

}while(p<=mid) c[q++]=a[p++];

while(m<=r) c[q++]=a[m++];

for(int j=l;j>n;

for(j=0;j>a[j];

}merge_sort(0,n-1);

cout<

歸併排序: 如 2 4 3 1 先將資料分成 2 , 4, 3, 1,四個陣列; 之後結合 2,4 和 3,1 將陣列 2,4和 3,1 排序 變為 用另外乙個陣列儲存(c

先讓 2和1比較 1比較小  儲存在c0中  之後2和3比較  c1=2,  4,3比較 c2=3  c3=4;
//將有序陣列a和b合併到c中

void

merge(

inta, 

intn, 

intb, 

intm, 

intc)  

while

(i c[k++] = a[i++];  

while

(j c[k++] = b[j++];  

}  這個是兩個陣列 a,b,c將 a,b合併到 c之中

如何將 乙個陣列 合併到另乙個陣列之中呢: 加入乙個中間 值  mid
//將a的兩部分有序數列a[first...mid]和a[mid+1...last]合併

void

merge(

inta, 

intleft(左邊), 

intmid, 

intright(右邊), 

intc)  

while

(i <= m)  

c[k++] = a[i++];  

while

(j <= n)  

c[k++] = a[j++];  

for(i = left; i 

a[i]=c[i];

}  之後就是 反覆呼叫函式對整個陣列的排序

void

merge_sort(

inta,

intfirst,

intlast,

intc)    }

可是歸併排序 和 你逆序數 有個卵子關係呢? 不要著急 我們回到開頭 說到 每次排序都會將小的排到前面 比如 3 1 在排序的時候我們會將 1排在3前面

看到這裡還是懵逼啊 這特麼怎麼算啊 呼叫函式這麼多次 我怎麼知道啊? 怎麼找  ? 不要著急 我們在來回頭看一下  將乙個陣列合併的程式  咦 然後就發現了這個 語句
while

(i <= m && j <= n)  

這個是什麼 是關鍵啊! 咱們假設這會 a陣列 就是 這兩個 來來來 一步一步來 第一步 :

注意else first:2 1比較 發現else c0=1 這個時候我們發現 最小的跑到最前面了對不對 這個時候我們就需要記錄了!!! 可是問題又來了 怎麼記錄呢? 我們發現 如果 a[j] 小於 a[i] 的話 a[j]會小於

a[mid-i] 所有的數 仔細想一下 我們之前已經將 陣列排好序了都是按照公升序排列 對吧!  所以當 else 的時候 我們會發現 sum需要加上 mid-i+1 (mid是a[i]的最後乙個數 所以需要加上1  

看到這裡我們理解了嗎?  就是這樣  以上有別的部落格的 也有自己總結的~ 寫到 一點   省賽剛剛結束 打了鐵 發現自己弱的要死 以後穩紮穩打  學乙個演算法必須學會 !  不然什麼都要忘記!   for  acm   come on!

逆序數(51Nod1019) 歸併排序

1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數...

51Nod 1019 逆序數 歸併排序

1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序數...

51 nod 1019 逆序數(歸併排序)

1019 逆序數 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 收藏 關注 在乙個排列中,如果一對數的前後位置與大小順序相反,即前面的數大於後面的數,那麼它們就稱為乙個逆序。乙個排列中逆序的總數就稱為這個排列的逆序數。如2 4 3 1中,2 1,4 3,4 1,3 1是...