逆序数求法
来源:互联网 发布:js点击显示再点击隐藏 编辑:程序博客网 时间:2024/05/16 08:54
求逆序数可以有三个方法,一个是模拟冒泡排序,效率低下;二是归并排序,求逆序数,一般够用;三是用树状数组,我还没研究过怎么用。
冒泡排序的算法:
for (int i = 0; i < t; i++) { for (int j = 0; j < t - i - 1; j++) if (a[j] > a[j + 1]) { swap(a[j], a[j + 1]); res++;//res就是要求的逆序数 } }
合并排序的算法:
#include<iostream>using namespace std;#define MAX 1000000000int a[500001];int tmp[500001];long long ans;//逆序数void Mergesort(int b, int e){ if (e - b <= 0) return; int mid = (b + e) / 2, p1 = b, p2 = mid + 1, i = b; Mergesort(b, mid); Mergesort(mid + 1, e); while (p1 <= mid || p2 <= e) { if (p2 > e || (p1 <= mid && a[p1] <= a[p2])) tmp[i++] = a[p1++]; else { tmp[i++] = a[p2++]; ans += (mid - p1 + 1); } } for (i = b; i <= e; i++)a[i] = tmp[i];}int main(){ int n; while(cin>>n,n) { for(int i=1; i<=n; i++) cin>>a[i]; ans=0; Mergesort(1,n); cout<<ans<<endl; for(int i=1; i<=n; i++)cout<<a[i]<<" "; cout<<endl; } return 0;}
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
刚刚把poj2299过掉,但是始终感觉1804过不掉不太爽。下到一个教案,说POJ上有个题,是必须用树状数组才能过的。等下准备去试一下。
在做2299的时候,最后的结果必须用长整形,发现在LINUX下,用NETBEANS,好像会编译不通过。不知道是什么原因。
由于这个类型用得很少,所以不太熟悉,还是在网上查了才知道怎么控制输入输出的。
要是用64位整形,直接这样用
__int64 res=0;
printf("%I64d/n",res);
要是LONG LONG形,可以这样用。
long long res;
printf("%u/n",res);
printf("%lld/n",res);
- 逆序数求法
- 逆序数的求法
- 逆序数的求法
- 逆序数 归并排序求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的几种求法
- 逆序数的三种求法
- 逆序数的几种求法
- 分治法 归并排序 加上逆序数求法
- 逆序对的递归求法
- 逆序对总结 【各种求法】
- 数素的求法
- 奇偶数求法
- 第五章 Interface Builder
- CMD命令速查手册 cmd命令大全
- unable to start program "..\bin\Debug\start.dll" 如何解决
- HDU 2063 过山车
- mysql求两个表的不同记录
- 逆序数求法
- php登录验证跳转相关的笔记
- 强制恢复
- 【总结备用】Android Activity切换动画汇总
- 两个view重叠时如何只让上层view响应触摸事件
- string 所有函数及功能
- WIN2003域服务器通过组策略禁止部门员工上网
- C语言四舍五入函数
- java测试错误集 -Spring