逆序对问题(归并)
2015-09-10 14:30
309 查看
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> using namespace std; int z[40005]; int az[40005];//辅助空间 int fun(int l, int r) { int sum = 0; if (r - l <= 1) { if (z[l] > z[r]) { az[l] = z[r]; az[r] = z[l]; z[l] = az[l];//放回 z[r] = az[r]; ++sum; } else { az[l] = z[l]; az[r] = z[r]; } return sum; } int m = (l + r) / 2; int i = l,j=m+1,zi=l; sum = fun(l, m) + fun(m + 1, r); while (i <= m&&j <= r) { if (z[i] < z[j]) { az[zi++] = z[i++]; } else { az[zi++] = z[j++]; sum += m - i + 1; } } while (i > m&&j <= r) { az[zi++] = z[j++]; } while (j > r&&i <= m) { az[zi++] = z[i++]; } for (int i = l; i <= r; ++i)//记得把辅助空间中排好序的数放回原数组 { z[i] = az[i]; } return sum; } int main() { int n; while (scanf("%d", &n) != EOF) { for (int i = 0; i < n; ++i) { scanf("%d", &z[i]); } printf("%d\n", fun(0, n - 1)); } return 0; }
相关文章推荐
- MySQL几个计算时间的函数汇总
- mysql忘记密码怎么办
- next_permutation
- cocos2dx 解释二具体的启动过程:内存管理和回调
- 使用NetHogs监控进程网络使用情况
- log4j 系统日志属性介绍
- Android studio问题
- javascript数据类型
- html5 登陆样例php
- android EditText inputType 中文解说
- popen 与system函数笔记
- VS2010 无法定位程序输入点 gzdirect于动态链接库zlib1.dll上
- Java异常
- windows dev center
- CI sessoin注意事项
- iOS UUID deprecated corebluetooth
- 3d md5 demo
- nginx_keepalived
- 属性生成方法
- Android AlertDialog setContentView输入法不显示