数据结构实验 9.求逆序对数
题目
【问题描述】
对于一个长度为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,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.求逆序对数相关推荐
- POJ 1804 Brainman (归并排序 -- 求逆序对数)
归并排序求逆序对数: 和归并排序一样,划分和递归求解都好理解,关键在于合并,对于右边的j ,统计出左边比j 大 的元素个数 f(j),所有的f(j)家和就是我们要的逆序对数! 在归并排序中,我们将右边 ...
- C/C++ 求逆序对数
逆序对定义:对一个序列a[n],若i<j且a[i]>a[j],则a[i]与a[j]为逆序对. 如:序列 3, 2, 1 的逆序对数为2+1=3. # include <bits/st ...
- OPJ2018年算法课第二次作业:F.求逆序对数
总时间限制: 500ms 内存限制: 65536kB 描述 对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序 请求出整数序列A的所 ...
- sdut 2137 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Descr ...
- 数据结构实验之求二叉树后序遍历和层次遍历
数据结构实验之求二叉树后序遍历和层次遍历 Description 已知一棵二叉树的前序遍历和中序遍历,求二叉树的后序遍历和层序遍历. Input 输入数据有多组,第一行是一个整数t (t<100 ...
- poj:Freda的越野跑 求正序对数
Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说,这N个 ...
- 实验7-3-1 字符串逆序 (15分)
解题思路 输入字符串用字符数组str1存储 逆序输出 源代码如下: #include<stdio.h> #define N 80 int main() {char ch;char str1 ...
- 1176: C语言实验题――数组逆序
描述:输入10个整数存入一维数组,再按逆序重新存放后再输出. 输入:输入包括一行. 10个以空格格开的整数 输出:逆序的10个整数,整数以空格格开 样例输入:1 3 5 9 7 6 8 2 4 0 样 ...
- 【数据结构】单链表逆序
编写算法,将一个结点类型为Lnode的单链表按逆序链接,即若原单链表中存储元素的次序为a1,--an-1,an,则逆序链接后变为,+an,an-1,--a1. Void contrary (Lnode ...
最新文章
- (DOM艺术) 实用的动画
- dxf转nc代码软件_eCAM高速激光加工软件
- weka: best first search
- QT实现自定义3D材质
- 上海出租车价格计算方法
- 为iOS5设计消息通知
- mysql 8.0远程连接_mysql8.0 安装 修改密码 允许远程连接
- 51nod1245 Binomial Coefficients Revenge
- 不会真有人觉得聊天机器人难吧
- 使用代理为业务操作添加安全检测
- 流式布局和viewport
- Java软件开发流程
- Centos中安装svnserver
- D3js-中国各主要大城市经纬度数据
- 【免费分享淘宝视频教程】pyhton大数据人工智能神经网络爬虫零基础视频教程从入门到精通-百度云
- 使用selenium自动登录126/163邮箱并自动发送邮件
- 安徽师大附中%你赛day4T1 金字塔 解题报告
- Linux下获取cpu温度
- 苹果电脑macos Ventura 13.2(22D49)dmg原版引导版镜像下载
- NUC970设备驱动
热门文章
- 前台向后台传递汉字参数时遭遇的问题
- Word 模板 - 新建向导
- dumpbin命令问题的解决办法【原】
- spring boot(三)Junit 测试controller
- 2014025675 《嵌入式系统程序设计》第七周学习总结
- Velocity 语法示例
- Window.ActiveXObject的用法 以及如何判断浏览器的类型
- 解决Lost connection to MySQL server at 'reading initial communication packet', 的方法
- HDU 1422 重温世界杯 环形序列的最长非负连续子序列
- 【嵌入式】Linux开发工具gdb及远程调试