zoukankan      html  css  js  c++  java
  • 归并排序模板(附求逆序对)

    逆序对满足两个条件, 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("
    %d
    ", cnt);
    	return 0;
    }
    
  • 相关阅读:
    用户模板和用户场景
    移动端疫情展示
    数据爬取
    全国疫情统计可视化地图-第二、三阶段
    学习进度条-第三周
    学习进度条-第二周
    软件工程第二周开课博客
    返回一个整数数组中最大子数组的和
    JavaWeb选课系统(2)
    JavaWeb选课系统
  • 原文地址:https://www.cnblogs.com/sugewud/p/9819603.html
Copyright © 2011-2022 走看看