题目

【问题描述】

对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj的数对(i,j)称为整数序列A的一个逆序。

请求出整数序列A的所有逆序对个数。

【输入形式】

输入包含多组测试数据,每组测试数据有两行,

第一行为整数N(1 <= N <= 20000),当输入0时结束,

第二行为N个整数,表示长为N的整数序列。

【输出形式】

每组数据对应一行,输出逆序对的个数。

【样例输入】

5

1 2 3 4 5

5

5 4 3 2 1

1

1

0

【样例输出】

0

10

0

分析

直接暴力遍历的话,算法复杂度肯定到O(n2)O(n^2)O(n2)

结合分治和归并排序的思想

  1. 我们可以将求一个序列的逆序数,转换为求左右两个序列的逆序数相加,同时进行从小到大的排序

  2. 而一个序列的逆序数怎么求?因为此序列已经由子序列递归得到,左右序列在各自的内部已经由小到大有序,分别从各自的第一个数开始比较,如果出现第一组的数大于第二组的数,那么第一组后面的数肯定大于第二组此时的数。

    举个例子:对于1,3,4,5,2,6,7,81,3,4,5,2,6,7,81,3,4,5,2,6,7,8,所以1,3,4,51,3,4,51,3,4,5是A,2,6,7,82,6,7,82,6,7,8是B组,可以看出组内已经有序,

    • 比较1和2,1<2,不统计,A组后移1个数
    • 比较3和2,3>2,所以逆序对+3(第一组后面还有3个数),B组后移1个数
    • 比较3和6,……
    • ……

代码

#include <iostream>
using namespace std;
#define maxn 1005int n, a[maxn],tmp[maxn];
int sum;void mysort(int left,int right){if (left >= right)return;int mid = (left + right) / 2;// 求左右序列逆序对数 mysort(left, mid);mysort(mid + 1, right);// 进行归并排序的同时,统计逆序对数 int p1 = left, p2 = mid+1,i=left;while (p1<=mid && p2<=right) {if (a[p1] <= a[p2])tmp[i++] = a[p1++];else if (a[p1] > a[p2])  {   //有逆序对,进行交换和统计tmp[i++] = a[p2++];sum += mid - p1 + 1;}}// 合并两个数组 while (p2 <= right)tmp[i++] = a[p2++];while (p1 <= mid)tmp[i++] = a[p1++];for (int i = left; i <= right; i++)a[i] = tmp[i];
}int main(){while (scanf("%d", &n) != EOF&&n) {sum = 0;for (int i = 1; i <= n; i++)cin >> a[i];mysort(1,n);cout << sum <<endl;}return 0;
}

数据结构实验 9.求逆序对数相关推荐

  1. POJ 1804 Brainman (归并排序 -- 求逆序对数)

    归并排序求逆序对数: 和归并排序一样,划分和递归求解都好理解,关键在于合并,对于右边的j ,统计出左边比j 大 的元素个数 f(j),所有的f(j)家和就是我们要的逆序对数! 在归并排序中,我们将右边 ...

  2. C/C++ 求逆序对数

    逆序对定义:对一个序列a[n],若i<j且a[i]>a[j],则a[i]与a[j]为逆序对. 如:序列 3, 2, 1 的逆序对数为2+1=3. # include <bits/st ...

  3. OPJ2018年算法课第二次作业:F.求逆序对数

    总时间限制: 500ms 内存限制: 65536kB 描述 对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序 请求出整数序列A的所 ...

  4. sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...

  5. 数据结构实验之求二叉树后序遍历和层次遍历

    数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...

  6. poj:Freda的越野跑 求正序对数

    Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说,这N个 ...

  7. 实验7-3-1 字符串逆序 (15分)

    解题思路 输入字符串用字符数组str1存储 逆序输出 源代码如下: #include<stdio.h> #define N 80 int main() {char ch;char str1 ...

  8. 1176: C语言实验题――数组逆序

    描述:输入10个整数存入一维数组,再按逆序重新存放后再输出. 输入:输入包括一行. 10个以空格格开的整数 输出:逆序的10个整数,整数以空格格开 样例输入:1 3 5 9 7 6 8 2 4 0 样 ...

  9. 【数据结构】单链表逆序

    编写算法,将一个结点类型为Lnode的单链表按逆序链接,即若原单链表中存储元素的次序为a1,--an-1,an,则逆序链接后变为,+an,an-1,--a1. Void contrary (Lnode ...

最新文章

  1. (DOM艺术) 实用的动画
  2. dxf转nc代码软件_eCAM高速激光加工软件
  3. weka: best first search
  4. QT实现自定义3D材质
  5. 上海出租车价格计算方法
  6. 为iOS5设计消息通知
  7. mysql 8.0远程连接_mysql8.0 安装 修改密码 允许远程连接
  8. 51nod1245 Binomial Coefficients Revenge
  9. 不会真有人觉得聊天机器人难吧
  10. 使用代理为业务操作添加安全检测
  11. 流式布局和viewport
  12. Java软件开发流程
  13. Centos中安装svnserver
  14. D3js-中国各主要大城市经纬度数据
  15. 【免费分享淘宝视频教程】pyhton大数据人工智能神经网络爬虫零基础视频教程从入门到精通-百度云
  16. 使用selenium自动登录126/163邮箱并自动发送邮件
  17. 安徽师大附中%你赛day4T1 金字塔 解题报告
  18. Linux下获取cpu温度
  19. 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
  20. NUC970设备驱动

热门文章

  1. 前台向后台传递汉字参数时遭遇的问题
  2. Word 模板 - 新建向导
  3. dumpbin命令问题的解决办法【原】
  4. spring boot(三)Junit 测试controller
  5. 2014025675 《嵌入式系统程序设计》第七周学习总结
  6. Velocity 语法示例
  7. Window.ActiveXObject的用法 以及如何判断浏览器的类型
  8. 解决Lost connection to MySQL server at 'reading initial communication packet', 的方法
  9. HDU 1422 重温世界杯 环形序列的最长非负连续子序列
  10. 【嵌入式】Linux开发工具gdb及远程调试