排列逆序数和计算

19 篇文章 1 订阅
5 篇文章 0 订阅

一. 排列的逆序与逆序数

逆序: 取一个排列为标准排列, 其它排列中某两个元素的次序与标准排列中这两个元素的次序相反时,则称这两个元素构成一个逆序.
逆序数: 一个排列中所有逆序总数叫做这个排列的逆序数. (注意是一个排列)
逆序数为偶数称为偶排列, 逆序数为奇数称为奇排列, 标准排列规定为偶排列.


通常取从小到大的排列为标准排列, 即 1 ~ n的全排列中取123...(n - 1)n为标准排列.

例: 123全排列的逆序数

全排列	逆序数	逆序对 
123		0							(排列123的逆序数为0)													
132		1		32					(排列132的逆序数为1)
213		1		21					....
231		2		21, 31						
312		2		31, 32
321		3		32, 31, 21

例: 1234全排列的逆序数

全排列	逆序数	逆序对
1 234
1 243			43
1 324			32
1 342			32, 42
1 423			42, 43
1 432			42, 43

2 134			21
2 143			21, 43
2 314			21, 31
2 341			21, 31, 41
2 413			21, 41, 43
2 431			21, 41, 43

3 124			31, 32
3 142			31, 32, 42
3 214			31, 32, 21
3 241			31, 32, 21, 41
3 412			31, 32, 41, 42
3 421			31, 32, 41, 42, 21

4 123			41, 42, 43
4 132			41, 42, 43, 32
4 213			41, 42, 43, 21
4 231			41, 42, 43, 21, 31
4 312			41, 42, 43, 31, 32
4 321			41, 42, 43, 32, 31, 21

http://www.tongji.edu.cn/~math/xxds/kcja/kcja_b/1-2.htm

二. 逆序数的计算

方法1: 直接遍历比较
int IinvertedSequence(char* pData, int nLen)
{
	int nCount = 0;
	int i, j;
	for(i = 0; i < nLen; ++i)
	{
		for(j = i + 1; j < nLen; ++i)
		{
			if(pData[i] > pData[j])
			{
				++nCount;
			}
		}
	}
	return nCount;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值