C++逆序数(奇排列和偶排列的判定)
逆序数简介
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(这里规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时,就说有1个逆序。一个排列中所有逆序总数叫做这个排列的逆序数。
而逆序数就是判定一个排列为奇排列还是偶排列的重点。如果逆序数为奇数,则此排列为奇排列,否则为偶排列。
举个例子,看53124这个序列,5在3前面,5在1前面,5在2前面,5在4前面,3在1前面,3在2前面,逆序数为6,故此排列为偶排列。
逆序数计算
如果直接模拟的话时间复杂度为On^2,但代码就简单的多了,可如果你想优化时间,那么就得使用到归并排序了。
注:如果你尚未学习过归并排序,可以浏览此网页来学习
https://blog.csdn.net/SkeletonKing233/article/details/100676151
而逆序数的计算在我们将两个子序列合并的时候累加就可以了。
举个例子,如果我们要将这两个子序列合并的话
1,4,6,7,9
2,3,5,10,13,21
当第一个序列枚举到第2个元素4,第二个序列枚举到第1个元素2时,4 > 2为逆序,我们需要进行累加,又因为两个子序列都是有序的所以如果4 > 2,那么第一个子序列从第2个元素4开始后面的所有数都必然比2大,所以让逆序数的值加上(mid - i + 1),既从第2个元素到第5个元素中元素的个数。这样时间复杂度就减少为On * log2(n)级别的了。
# include <cstdio>
# include <iostream>
# include <cmath>
# include <cstring>
# include <algorithm>
using namespace std;# define FOR(i, a, b) for(int i = a; i <= b; i++)
# define _FOR(i, a, b) for(int i = a; i >= b; i--)const int NR = 100000;int n, cnt;
int a[NR + 10];void MergeArray(int left, int mid, int right){int ans[NR + 10], len = 0;int t1 = left, t2 = mid + 1;while(t1 <= mid && t2 <= right){if(a[t1] < a[t2]) ans[++len] = a[t1++];else{ans[++len] = a[t2++];cnt += mid - t1 + 1;}}while(t1 <= mid) ans[++len] = a[t1++];while(t2 <= right) ans[++len] = a[t2++];FOR(i, left, right) a[i] = ans[i - left + 1];
}void MergeSort(int left, int right){if(left >= right) return;int mid = (left + right) / 2;MergeSort(left, mid);MergeSort(mid + 1, right);MergeArray(left, mid, right);
}int main()
{scanf("%d", &n);FOR(i, 1, n) scanf("%d", &a[i]);MergeSort(1, n);printf("此排列逆序数为%d\n", cnt);if(cnt % 2 == 1) puts("此排列为奇排列");else puts("此排列为偶排列");return 0;
}
C++逆序数(奇排列和偶排列的判定)相关推荐
- 计算矩阵行列式时奇排列与偶排列的判定
在计算矩阵行列式时需要判断求和公式中矩阵元素第二个脚标的排列的奇偶性来决定这一求和项的正负. 定义:降序次数为偶数的排列为偶排列:降序次数为奇数的排列为奇排列. 例如排列(2,3,1):从左往右看,2 ...
- 高代第2章第1节n元排列:奇排列、偶排列的判断
int Permu(char *s){//s为数字字符串从1到n的随机排列int l=strlen(s);int L[l],Sum=0;for(int i=0;i<l;i++){L[i]=1;} ...
- 2021-08-30-全排列-逆序数-排列的奇偶性
全排列 定义:把n个不同的元素排成的一列,称为这n个元素的一个全排列,简称排列. 把n个不同的元素排成一列,共有Pn种排法. 逆序数 规定 标准次序 标号由小到大的排列 定义:在n个元素的 ...
- 互换矩阵任意两行(列),行列式变号——证明:互换排列中任意两个数,排列逆序数的奇偶性改变
关于排列的一个简单结论证明---互换排列中任意两个数,排列的逆序数奇偶性改变 一. 引言:在大学线性代数中,有关于行列式的一个常见的定理:*互换任意两行(列),行列式变号.*由行列式完全展开式可以很明 ...
- 逆序数问题(归并排序,C++)
在求解八数码问题时,因为要进行逆序数的计算判断两个结点的可达性,同奇偶的逆序数才能可达.如果只是八数,暴力解法还好,当数字多了之后如何知道逆序数呢. 题目描述 通过计算八数码节点的逆序数判断.如果一对 ...
- 【归并排序】求逆序数算法
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序. 一个排列中逆序的总数就称为这个排列的逆序数.逆序数为偶数的排列称为偶排列:逆序数为奇数的排列称为奇排 ...
- 分治法求一个N个元素数组的逆序数
背景 逆序数:也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同时, ...
- 逆序数(inverse number)
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 对于n个不同的元素,先规定各元素之间有一个标准次序(例如 ...
- 全排列与逆序数的组合
之前也做过这类题,现在做又忘了,整理一下. ACM中遇到逆序数最多的就是 全排列+逆序数 引入 这样一题: 给出n个数字,求使用冒泡排序所需要交换的次数(n到5e5)(POJ2299) 问题可以转化为 ...
最新文章
- 她是985高校的90后博导!常被认成“师姐”,喜欢减压式教学
- 函数在实现过程内存中的压栈和出栈
- #中的引用型是什么意识_excel的vlookup函数经常引用错误,让我告诉你原因,迅速脱离误区...
- apidoc文档项目构建
- CEO 赠书 | 讲述创新背后不为人知的故事,改变世界的 Ta 们做对了什么?
- 数据库:SQLServer中GUID用法介绍
- vb简易计算机器程序,vb简易计算器源码
- php计算器等号没反应,为什么按等号没有反应?
- dj鲜生-38-项目上线简介-从本地小项目到云服务的调试
- Jaxb2 转换XML文档
- sql2008r2服务器维护,Windows Server 2008 r2服务器上安装SQL Server 2008 r2的方法
- STM8S003F3控制LED
- 医院信息系统等级保护
- Matlba实现傅里叶变换及其逆变换
- ear的英语怎么念_适合三年级英语课堂的小游戏
- 微信小程序基础功能解析
- MirrorSys:沉浸式现实是一种怎样的体验?
- Z-Libary最新地址检测,再也不用担心找不到ZLibary了
- 100行代码 5分钟开发一个数字货币行情软件(升级版)
- OSChina 周二乱弹 —— 昔人已乘地铁去,此地空余一只鞋
热门文章
- Auto.js学习笔记13:images.findImag()报错找不到方法,返回的坐标无法点击等问题利用图片的相似度执行精准目标点击(实战篇)
- BusyCal for Mac(任务日历工具)
- 降维中信息的损失对聚类结果的影响图形化表示
- 滴滴Uber又打起来了!外卖领域C位花落谁家?
- 【小程序背景图之海贼王篇】
- vue 根据身份证号获取性别,年龄,出生年月
- ClickHouse MergeTree二级索引/跳数索引
- linux_C_fork函数/execv/execl的使用_数据类型pid_t/getpid/sleep /warning: missing sentinel in function call
- 【Linux】3.0Linux进程概念
- 26种英语形容词后缀讲解