排列,逆序

1,2,3...,n这n个数字组成的一个有序数组称为一个n级(阶)排列,共有A(n,n)=n!个不同的排列。
在一个n阶排列中如果较大的数排在较小的数的前面,,则称这两个数构成一个逆序.一个排列中的所有
逆序的总和叫做这个排列的逆序数。逆序数为奇数的排列叫做奇排列,逆序数为偶数的排列叫做偶排列
特别的,自然排列是逆序数为0的排列,算做是偶排列。

把一个排列中的某两个数位置对换,而其余的数位置不变,就得到一个排列,这样的一个变换叫做对换
定理:对换改变排列的奇偶性
证:
1、当对换的两个数在排列中是相邻时,排列...ab...---->...ba...,这里...表示那些位置不变的数,显然
ab对换后,它们的逆序数不变,当 a<b时,对换之后,它们构成逆序,逆序数+1,同理a > b时
对换之后,逆序数-1
2、设排列为a(i1)(i2)...(in)b , ab对换--->b(i1)(i2)...(in)a,
我们可以这么看,b做n+1次相邻对换---->ba(i1)(i2)...(in),
然后a做n次相邻对换---->b(i1)(i2)...(in)a,所以一共做了2n+1次相邻对换,而2n+1为奇数
由1,2可得,对换改变排列的奇偶性。

n个数构成的所有排列中,奇偶排列各占据一半

时间: 2024-10-23 11:33:43

排列,逆序的相关文章

算法题:一个N字节的数,如何逆序排列各个位(bit)?例如1字节的数 0010 0011 =&gt; 1100 0100

一个简简单单的题,如果用Java,C++,C估计还挺麻烦的,大体思路就是,开辟个N字节空间,用移位掩码方法逆向给每个bit赋值,这里由于N可能比较大,还得记录些额外的边界信息. 用Erlang则会简单很多: -module(bitoperator). -export([bit_reverse/1]). bit_reverse(Bin) -> L = [X || <<X:1>> <= Bin], Lr = lists:reverse(L), Br = list_to_bi

51Nod 1020 逆序排列

 1020 逆序排列 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4. 1-n的全排列中,逆序数最小为0(正序),最大为n*(n-1) / 2(倒序) 给出2个数n和k,求1-n的全排列中,逆序数为k的排列有多少种? 例如:n = 4 k = 3. 1 2 3 4的排列中逆序为3的共有6个,分别是: 1 4 3 2 2 3 4 1

10.14 将n个数按输入输出顺序的逆序排列,用函数实现

将n个数按输入输出顺序的逆序排列,用函数实现. #include <stdio.h> int main(){ int n,i; void reverse(int * num, int n); printf("input n="); scanf("%d",&n); int num[20]; printf("输入%d个数.\n",n); for(i=0; i<n; i++){ scanf("%d",&am

51nod1020 逆序排列(dp)

1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4. 1-n的全排列中,逆序数最小为0(正序),最大为n*(n-1) / 2(倒序) 给出2个数n和k,求1-n的全排列中,逆序数为k的排列有多少种? 例如:n = 4 k

蓝桥杯- 算法提高 逆序排列

算法提高 逆序排列 时间限制:1.0s   内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存放,并打印出来.例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的值按逆序重新存放,即变成了2 6 -5 19 7,然后把它们打印出来. 输入格式:输入只有一行,由若干个整数组成,

算法笔记_158:算法提高 逆序排列(Java)

目录 1 问题描述 2 解决方案 1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存放,并打印出来.例如:假设用户输入了一组数据:7 19 -5 6 2 0,那么程序将会把前五个有效数据保存在一个数组中,即7 19 -5 6 2,然后把这个数组中的值按逆序重新存放,即变成了2 6 -5 19 7,然后把它们打印出来. 输入格式:输入只有一行,由若干个整数组成,中间用空格隔开,最末尾

逆序排列

/** 例子输入 7 19 -5 6 2 0 例子输出 2 6 -5 19 7 */ import java.util.*; import java.io.*; public class 逆序排列 { public static void main(String[] args) { Scanner in=new Scanner(new BufferedInputStream(System.in)); int [] a=new int [21]; int num=0; a[0]=in.nextIn

算法之链表逆序排列

算法纯属个人爱好,欢迎交流,共享 /** * */ package com.zimo.sequence; /** * 逆序排列 * @author 子墨 * * 2015-3-11下午2:31:55 */ public class Node { int data; Node next = null; public Node(int data){ this.data=data; } /** * 1->2->3->4->5->6->7->8->9 * 定义一个p

51nod 1020 逆序排列(动态规划)

分析:记dp[n][k]为n个数,逆序数为k的个数,将dp[n][k]分为两部分,一部分有1~n-1的逆序构成,一类是有n的逆序,可以得到dp[n+1][k+1]=(max(0,k+1-n),min(k+1,n*(n-1)/2)∑dp[n][i],再用dp[n+1][k+1]与dp[n+1][k]做差,讨论一下k和n的关系就可以写出递推式了. 1 #include<iostream> 2 using namespace std; 3 const int maxn=1005,maxk=20005