博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
归并排序模板(附求逆序对)
阅读量:7308 次
发布时间:2019-06-30

本文共 870 字,大约阅读时间需要 2 分钟。

逆序对满足两个条件, 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) //这里是左闭右开区间, 区间分两段不需要加一减一 { 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

你可能感兴趣的文章
Scrollview 和 内部 recycleview 高度固定时嵌套冲突的一种解决方法
查看>>
h5引用第三方字体库
查看>>
PHPer 面试指南-扩展阅读资源整理
查看>>
设计模式-单例模式
查看>>
package.json和package-lock.json
查看>>
pattern
查看>>
MyBatis中井号与百分号的区别
查看>>
新建一个xib
查看>>
初识HTTP
查看>>
Python安装(一)
查看>>
thinkphp 输出变量使用函数处理
查看>>
MySQL学习笔记 - 1 - 基本架构与日志两阶段提交
查看>>
编程语言对比手册(横向版)[-PHP-]
查看>>
Vue 中状态管理VueX的使用方法?
查看>>
thinkphp控制器获取参数
查看>>
Netty源码分析(七):初识ChannelPipeline
查看>>
Semaphore-信号量的实现分析
查看>>
iOS逆向之旅(进阶篇) — 工具(class-dump)
查看>>
排序算法-归并排序
查看>>
今日学习笔记:hash 以及 nodejs基本服务
查看>>