歸併排序模板(附求逆序對)

2021-08-19 06:03:43 字數 491 閱讀 3854

逆序對滿足兩個條件, i < j 和 ai > aj

歸併可以求逆序對, 因為是按順序加入, 所以右區間加入的時候, 左區間的數滿足 i < j, 然後左邊還沒有加入的數肯定比當前的a[q]要大, 應該是按大小加入的, 所以滿足ai >aj, 所以這個時候計數器可以加上左區間還沒加入數的個數, 即m-p, 注意是左閉右開區間, 所以m-p不用加一。

#include#define rep(i, a, b) for(int i = (a); i < (b); i++)

using namespace std;

const int maxn = 112;

int a[maxn], cnt, n;

void merge_sort(int l, int r) //這裡是左閉右開區間, 區間分兩段不需要加一減一

rep(i, l, r) a[i] = t[i];}

int main()

模板 歸併排序求逆序對

p1908 逆序對 includeusing namespace std int a 500005 int tmp 500005 long long ans 0 void mergesort int l,int r while i mid tmp tot a i while j r tmp tot ...

歸併排序求逆序對

排序都用qsort了,別的排序演算法不怎麼用,但有些排序的思想很重要。碰到一道求逆序對的題,要用到歸併排序,學習了一下歸併排序。歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟 分解 將n個元素分成個含n 2個元素的子串行。解決 用合併排序法對兩個子串行遞迴的排序。合併 合併兩個已排序的子串行...

歸併排序求逆序對

我們知道,求逆序對最典型的方法就是樹狀陣列,但是還有一種方法就是merge sort 即歸併排序。實際上歸併排序的交換次數就是這個陣列的逆序對個數,為什麼呢?我們可以這樣考慮 歸併排序是將數列a l,h 分成兩半a l,mid 和a mid 1,h 分別進行歸併排序,然後再將這兩半合併起來。在合併的...