求逆序数
来源:互联网 发布:数据库开发有什么用 编辑:程序博客网 时间:2024/04/29 08:03
POJ2299 Ultra-sort可以转成求逆序数。
求逆序数可以用冒泡的方法做,但通常用归并排序做,先分别求左右两部分的逆序数,两部分都排好序后再求两者之间的逆序数。因此求逆序数是归并排序的副产品。与归并排序的主要差别也就在一句ret += (a + m - posa);
没有ac,惭愧。
#include <cstdio>
#include <vector>
using namespace std;
__int64 mergearr(int* a, int m, int* b, int n)
{
__int64 ret = 0;
int* assit = new int[m + n];
int* posa = a, *posb = b, *cur = assit;
while (posa < a + m && posb < b + n)
{
if (*posa <= *posb)
{
*cur = *posa;
++cur;
++posa;
}
else
{
*cur = *posb;
++cur;
++posb;
ret += (a + m - posa);
}
}
if (posa == a + m)
{
for (; posb < b + n; ++posb,++cur)
{
*cur = *posb;
}
}
else
{
for (; posa < a + m; ++posa, ++cur)
{
*cur = *posa;
}
}
memcpy(a, assit, sizeof(int) * (m + n));
delete assit;
return ret;
}
__int64 mergesort(int* base, int n)
{
if (n == 1)
{
return 0;
}
int half = (n >> 1);
__int64 ret = mergesort(base, half);
ret += mergesort(base + half, n - half);
ret += mergearr(base, half, base + half, n - half);
}
int main()
{
int i,n;
vector<int> vec;
vec.resize(500001);
for (; ;)
{
scanf("%d", &n);
if (!n)
{
break;
}
for (i = 0; i < n; ++i)
{
scanf("%d", &vec[i]);
}
__int64 res = mergesort(&vec[0], n);
printf("%I64d/n", res);
}
return 0;
}
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数
- 求逆序数算法
- 求逆序数
- 求逆序数#no
- 求逆序数
- NYOJ117 求逆序数
- 求逆序数
- 求序列逆序数
- nyoj117求逆序数
- NYOJ 求逆序数
- MergeSort 求逆序数
- 输出文件的树形目录,项目和文档辅助小工具
- 生活的真谛
- SQL 开发人员 Oracle Berkeley DB 指南(zz)
- 最开心的事
- java 学习心得体会(二)
- 求逆序数
- 把生命放在美丽的焦距上——记桂林、阳朔、龙胜之旅
- JavaScript 事件
- java 学习心得体会(一)
- 学习资料:选购二手房的十看十不看
- 使用GAE(Google App Engine)一步一步开发自己的博客[1]:新手上路
- 堆和栈的区别
- stl中vector,list,deque的使用准则
- 传智播客——JAVAMAIL(一)