void
guibing
(int r,
int temp,
int s,
int m,
int t)
//陣列r的兩個連續的有序列,從第s到第m個,從第m+1到第t個,合併產生乙個有序列:從第s到第t
else
temp[k++
]=r[j++];
}while
(i<=m)
while
(j<=t)
//將剩餘的插入,只會進行兩個while中的乙個
for(
int i=s;i<=t;i++)}
void
sortt
(int r,
int temp,
int s,
int t)
例題:每當輸入乙個n時,(n <500000),都有乙個陣列a[n],0<=a[i]<=999999999,統計該陣列中的逆序數
思路:如果用雙重迴圈i,j以此判斷a[i]>a[j],時間複雜度為o(n^2),500000*500000明顯超時
改用歸併排序法o(nlogn)
**如下:
#include
using
namespace std;
typedef
long
long ll;
int a[
500000
],t[
500000];
ll ans;
void
guibing
(int a,
int l,
int mid,
int r)
else t[k++
]=a[i++];
}while
(i<=mid)t[k++
]=a[i++];
while
(j<=r)t[k++
]=a[j++];
for(
int i=l;i<=r;i++
)a[i]
=t[i];}
void
sortt
(int a,
int l,
int r)
intmain()
return0;
}
歸併排序法
之前覺得這個很難,後來看了一些部落格,理解了之後總算是懂了。算是之前的補充。並且今天筆試有排序演算法,正好做個記錄,加深映象 歸併排序的核心是分而治之,先分開,再兩兩合併,合併的時候調整順序。例如 待排序序列 4 8 5 3 9 6 2 4 第一次分 4 8 5 3 9 6 2 4 第二次分 4 8...
歸併排序法
合併排序 merge sort 是又一類不同的排序方法,合併的含義就是將兩個或兩個以上的有序資料序列合併成乙個新的有序資料序列,因此它又叫歸併演算法。它的基本思想就是假設陣列a有n個元素,那麼可以看成陣列a是又n個有序的子串行組成,每個子串行的長度為1,然後再兩兩合併,得到了乙個 n 2 個長度為2...
歸併排序法
1 doctype html 2 html 3 head 4 meta charset utf 8 5 meta name viewport content width device width 6 title 歸併排序法 title 7head 8 body 9歸併排序是一種分治演算法,其思想是將...