按照劉汝佳說的,歸併排序分三步
1.劃分問題,即把序列分成元素盡量相等的兩半
2.遞迴求解
3.合併子問題
其實就是把乙個序列不斷的二分,直到只有兩個元素的時候,然後排序,然後返回,再排序。
先上**
#include
using namespace std;
long long a[100005],t[100005];
long long ans=0;
void mergesort(int lb,int ub)
//當前乙個子串行的元素大於後乙個子串行的元素時,那麼前乙個子串行的那個元素後面的元素也就都大於後乙個子
else t[num++]=a[i++];//序列的元素,即mid-i+1
}while(i<=mid) //如果乙個序列為空的時候,就把另乙個序列依次放回去
t[num++]=a[i++];
while(j<=ub)
t[num++]=a[j++];
for(int i=lb;i<=ub;i++)
a[i]=t[i];
}int main()
這裡對應了codevs的1688求逆序對
這是練習歸併排序的經典例題,劉汝佳的書上也是這道題,歸併排序的複雜度位nlogn,
逆序對 (歸併排序)
逆序對的nlogn方法,改進後的歸併排序 給定排列p,求排列的逆序對數量。p的長度 100000。要求o nlogn 定義歸併排序過程merge l,r merge l,r merge l,mid merge mid 1,r count l,mid,mid 1,r 只需要考慮左右兩段之間造成的逆序對...
歸併排序(逆序對)
現在我們在競賽中最常用的排序是快速排序,c 只要乙個sort就搞定,但非常明顯,歸併排序的時間複雜度是最優的而且非常穩定,但是人們經常把它用在求逆序對個數上面。那麼下面我用乙個這樣的題來講一下歸併排序。點這裡看題目和樹狀陣列解法。歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,...
逆序對 歸併排序
7 7 逆序對 20 分 對於乙個包含n個非負整數的陣列a 1.n 如果有i j,且a i a j 則稱 i j 為陣列a中的乙個逆序對。例如,陣列 3,1,4,5,2 的逆序對有 3,1 3,2 4,2 5,2 共4個。輸入包含若干組資料,第一行為乙個整數t 0對輸入中的每組測試資料,輸出一行對應...