逆序對 分治nlogn

2022-08-20 13:39:11 字數 539 閱讀 7762

定義:a是包含n個元素的有序序列{a1,a2 … an},若ai > aj 且 i < j ,則稱 (ai , aj)是a的乙個逆序對。求逆序對是指求出a中存在逆序對的數量。

這個演算法是歸併排序的演化,僅需加上一行,就可以求逆序對個數。

簡單的概括是:在把兩個子串行合併時(兩個子串行已經有序),如果當前選的最小的數在後面那個序列中,就把ans加上前面那個陣列剩下的元素個數。  

具體一點來講,設指標i,j分別指向左子串行和右子串行中的某個數,即low<=i<=mid,mid+1<=j<=high。當ia[j],即a[i]和a[j]為乙個逆序對,因為兩個子串都是由小到大排好序的,可知a[l]…a[mid]均大於a[j],均可以構成逆序對,共有mid-l+1個。

void he(int st,int end,int

mid)

else

}for(int i=st;i<=end;i++)a[i]=temp[i];

}void my_msort(int l,int

r)}

最後ans即是逆序對個數

陣列中的逆序對(分治)

題目描述 在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。輸入 每個測試案例包括兩行 第一行包含乙個整數n,表示陣列中的元素個數。其中1 n 10 5。第二行包含n個整數,每個陣列均為int型別。輸出 對應每個測試案例,輸出...

統計逆序對的個數,並輸出具體的逆序對(分治演算法)

要求 借鑑歸併排序的演算法,在歸併的過程中,統計逆序對的個數,並記錄下具體的逆序對。設計乙個分治演算法,並用c c 語言實現程式設計。include stdio.h int count 0 void merge int r,int r1,int s,int m,int t 合併子串行 else r1...

最近點對分治演算法

對於平面上給定的 n nn 個點,給出所有點的座標,即輸入是平面上的 n nn 個點,輸出是 n nn 點中具有最短距離的兩點。法一 暴力,時間複雜度 o n 2 o n 2 o n2 法二 分支,時間複雜度 o n log n o nlog n o nlog n 當然,此部落格 二。對於乙個點我們...