归并排序模板(附求逆序对)
生活随笔
收集整理的這篇文章主要介紹了
归并排序模板(附求逆序对)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
逆序對滿足兩個條件, i < j 和 ai > aj
歸并可以求逆序對, 因為是按順序加入, 所以右區間加入的時候, 左區間的數滿足 i < j, 然后左邊還沒有加入的數肯定比當前的a[q]要大, 應該是按大小加入的, 所以滿足ai >aj, 所以這個時候計數器可以加上左區間還沒加入數的個數, 即m-p, 注意是左閉右開區間, 所以m-p不用加一。
?
#include<cstdio> #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) //這里是左閉右開區間, 區間分兩段不需要加一減一 {if(l + 1 >= r) return;int m = (l + r) >> 1; // l與r的平均數 merge_sort(l, m); merge_sort(m, r); //先遞歸, 再求解 int i = l, j = m, t[MAXN];REP(k, l, r){if(j >= r || i < m && a[i] <= a[j]) t[k] = a[i++]; //右區間空或者左區間非空且a[p]更優的時候加入 else t[k] = a[j++], cnt += m - i;}REP(i, l, r) a[i] = t[i]; }int main() {scanf("%d", &n);REP(i, 0, n) scanf("%d", &a[i]);merge_sort(0, n);REP(i, 0, n) printf("%d ", a[i]);printf("\n%d\n", cnt);return 0; }?
轉載于:https://www.cnblogs.com/sugewud/p/9819603.html
總結
以上是生活随笔為你收集整理的归并排序模板(附求逆序对)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5分钟快速打造WebRTC视频聊天转
- 下一篇: Scrum 冲刺博客第四篇