歸併排序 逆序對

2021-08-10 10:22:01 字數 652 閱讀 7904

按照劉汝佳說的,歸併排序分三步

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對輸入中的每組測試資料,輸出一行對應...