归并排序求逆序对
来源:互联网 发布:heading标签优化 编辑:程序博客网 时间:2024/06/06 01:04
求逆序对方法有两种:
树状数组和归并排序,还有暴力
暴力就是两个for循环判断当i<j时,若a[i]>a[j],则ans++;
这里先说归并排序吧,在另一篇博客中再讲树状数组求逆序对(实际上是我写树状数组的还有bug没找到.......)
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N = 100005;int a[N],tmp[N];long long ans;void merg_sort(int l, int m, int r){ int i=l; int j=m+1; int k=l; while(i<=m&&j<=r) { if(a[i]>a[j]) //左边的比右边的大时; { tmp[k++]=a[j++]; ans += (m+1-i); //计算逆序数; } else tmp[k++]=a[i++]; //右边的比左边的大时; } while(i<=m) tmp[k++]=a[i++]; //左边有多余时; while(j<=r) tmp[k++]=a[j++]; //右边有多余时; for(int i=l; i<=r; i++) { a[i] = tmp[i]; //排序后重新赋值给a; }}void merg(int l, int r){ if(l<r) { int m=(l+r)>>1; merg(l, m); merg(m+1, r); merg_sort(l, m, r); }}int main(){ int n; while(~scanf("%d", &n)) { for(int i=0; i<n; i++) { scanf("%d", &a[i]); } ans=0; merg(0, n-1); printf("%lld\n", ans);}}
0 0
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对~~~
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 归并排序求逆序对
- 随笔
- Python CPU,内存实时获取
- Android studio 2.0--android增量更新的那些事
- Eclipse问题Access restriction: The type 'SunJCE' is not API 解决,并加深理解/jre与/jdk目录下jre的区别
- CF148 A Insomnia cure
- 归并排序求逆序对
- Spring学习笔记(四)-- Spring事务全面分析
- 如何确定函数依赖和其作用
- 其他浏览器均正常显示,uc不显示效果
- 可以免费自学编程的12个网站
- node.js在webstorm 11中的调试
- Android-BroadcastReceiver详解
- iOS开发总结之自定义等高cell03-xib
- OpenCV学习笔记(六)(七)(八)(九)(十)