题目链接:

  http://poj.org/problem?id=2299

题目描述:

  给一个有n(n<=500000)个数的杂乱序列,问:如果用冒泡排序,把这n个数排成升序,需要交换几次?

解题思路:

  根据冒泡排序的特点,我们可知,本题只需要统计每一个数的逆序数(如果有i<j,存在a[i] > a[j],则称a[i]与

a[j]为逆序数对),输出所有的数的逆序数的和用普通排序一定会超时,但是比较快的排序,像快排又无法统计

交换次数,这里就很好地体现了归并排序的优点。典型的利用归并排序求逆序数。

  归并排序:比如现在有一个序列[l,r),我们可以把这个序列分成两个序列[l,mid),[mid,r),利用递归按照上

述方法逐步缩小序列,先使子序列有序,再使子序列区间有序,然后再把有序区间合并,很好滴体现了分治的思想。

代码:

 #include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
using namespace std;
#define maxn 500010 int a[maxn], b[maxn];
long long count; void merge (int l, int r);
int main ()
{
int n, i;
while (scanf ("%d", &n), n)
{
memset (a, , sizeof (a));
memset (b, , sizeof (b));
for (i=; i<n; i++)
scanf ("%d", &a[i]);
count = ;//一定要用int64,int32会溢出
merge (, n);
printf ("%lld\n", count);
}
return ;
} void merge (int l, int r)//归并排序,参数分别是子区间的位置
{
if (r - l <= )
return ;
int mid = l + (r - l) / ;
merge (l, mid);
merge (mid, r);
int x = l, y = mid, i = l;
while (x<mid || y<r)//对子序列进行排序,并且存到数组b里面
{
if (y >= r || (x < mid && a[x] <= a[y]))
b[i ++] = a[x ++];
else
{
if (x < mid)//记录交换次数
count += mid - x;
b[i ++] = a[y ++];
}
}
for (i=l; i<r; i++)//把排好序的子序列抄到a数组对应的位置
a[i] = b[i];
}

最新文章

  1. TortoiseGit 连接oschina不用每次输入用户名和密码的方法
  2. Atitit &#160;java jsp 新的tag技术
  3. PHP中“简单工厂模式”实例讲解
  4. python的函数及参数
  5. C++复习-练习-1
  6. input text 的事件及方法
  7. 让UIWebView弹出键盘上的按钮显示中文
  8. 转:php连接oracle设定字符集,避免乱码
  9. Python模块的介绍
  10. QT动画介绍(有例子可以下载)
  11. private static
  12. DLL调试方法
  13. Linux services, runlevels, and rc.d scripts
  14. 获取屏幕宽高度与可视区域宽高度(availWidth、clientWidth、width、innerWidth)
  15. 旅游类App的原型制作分享-Klook
  16. python语言学习--2
  17. go标准库的学习-reflect
  18. Javascript日常编码中的一些常见问题
  19. ntldr is missing
  20. [转]【MyBatis】Decimal映射到实体类出现科学计数法问题

热门文章

  1. FIREDAC连MYSQL中文乱码的解决办法
  2. 将oracle10g 升级至10.2.0.4
  3. HadoopMapReduce运行机制
  4. VB6 如何自定义代码字体和支持鼠标滚轮
  5. 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
  6. ./configure &amp;&amp; make &amp;&amp; make install详解 (转)
  7. js常用的正则表达操作
  8. [IT学习]跟阿铭学linux(第3版)
  9. 有关 enum的重新理解
  10. POJ2594 Treasure Exploratio —— 最小路径覆盖 + 传递闭包