逆序对 - 归并排序求逆序对
2015-12-24 10:49
204 查看
#include <bits/stdc++.h>
using namespace std;
class Solution
{
public:
int InversePairs(vector<int> data)
{
ans = 0;
merge_sort(data, 0, data.size() - 1);
return ans;
}
vector<int> merge(vector<int> &vl, vector<int> &vr)
{
int n1 = vl.size(), n2 = vr.size();
vector<int> res(n1 + n2);
int i = 0, j = 0, cnt = 0;
while (i < n1 && j < n2)
{
if (vl[i] <= vr[j])
res[cnt++] = vl[i++];
else
{
ans += n1 - i;/* 统计答案 */
res[cnt++] = vr[j++];
}
}
while (i < n1)
res[cnt++] = vl[i++];
while (j < n2)
res[cnt++] = vr[j++];
return res;
}
vector<int> merge_sort(vector<int> &nums, int l, int r)
{
vector<int> vl, vr;
if (l < r)
{
int mid = (l + r) >> 1;
vl = merge_sort(nums, l, mid);
vr = merge_sort(nums, mid + 1, r);
return merge(vl, vr);
}
else
{
vector<int> ve(r - l + 1);
int cnt = 0;
for (int i = l; i <= r; ++i)
ve[cnt++] = nums[i];
return ve;
}
}
private:
int ans;
};
int main(int argc, char const *argv[])
{
int n;
while (cin >> n)
{
vector<int> nums(n);
for (int i = 0; i < n; ++i)
cin >> nums[i];
Solution solution;
int ans = solution.inversePairs(nums);
cout << ans << endl;
}
return 0;
}
using namespace std;
class Solution
{
public:
int InversePairs(vector<int> data)
{
ans = 0;
merge_sort(data, 0, data.size() - 1);
return ans;
}
vector<int> merge(vector<int> &vl, vector<int> &vr)
{
int n1 = vl.size(), n2 = vr.size();
vector<int> res(n1 + n2);
int i = 0, j = 0, cnt = 0;
while (i < n1 && j < n2)
{
if (vl[i] <= vr[j])
res[cnt++] = vl[i++];
else
{
ans += n1 - i;/* 统计答案 */
res[cnt++] = vr[j++];
}
}
while (i < n1)
res[cnt++] = vl[i++];
while (j < n2)
res[cnt++] = vr[j++];
return res;
}
vector<int> merge_sort(vector<int> &nums, int l, int r)
{
vector<int> vl, vr;
if (l < r)
{
int mid = (l + r) >> 1;
vl = merge_sort(nums, l, mid);
vr = merge_sort(nums, mid + 1, r);
return merge(vl, vr);
}
else
{
vector<int> ve(r - l + 1);
int cnt = 0;
for (int i = l; i <= r; ++i)
ve[cnt++] = nums[i];
return ve;
}
}
private:
int ans;
};
int main(int argc, char const *argv[])
{
int n;
while (cin >> n)
{
vector<int> nums(n);
for (int i = 0; i < n; ++i)
cin >> nums[i];
Solution solution;
int ans = solution.inversePairs(nums);
cout << ans << endl;
}
return 0;
}
相关文章推荐
- DP - 字符混编
- PHP文件上传问题汇总(文件大小检测、大文件上传处理)
- JS 字符串操作函数 往指定位置插入字符 删除指定位置字符 替换指定位置字符
- 3D打印如何助力中国制造破局
- 笔试面试题总结(三)--- 软件开发
- MySQL连接问题浅析
- MySQL连接问题浅析
- MySQL连接问题浅析
- Linux 安装python插件 测网速
- cURL进行HTTPS连接POST数据
- 数据库面试题 Java 程序员 SQL 深入解析(一)
- linux 下 openOffice swftools 的安装
- MySQL连接问题浅析
- .Net 项目代码风格要求小结
- powerdesigner 画ER图
- linux挂载CDROM
- Canonical:全球 Ubuntu 用户可能超过了10亿
- 让你分分钟学会javascript闭包
- 项目使用log4j,指定日志打印出来的格式,打印到指定文件夹,每天打印一个日志等配置
- 排序算法:快速排序