字典排序法

合集下载

字典序排序规则

字典序排序规则

字典序排序规则字典序,也称为英文字母顺序,是一种使用字母表进行顺序排列的方式。

它也被称为字母表排序法,其有效性已经被大量应用于信息管理、文件组织和文本处理等领域。

字典序是一种以字母表为基础的排序方式,它可以比较任何一个特定的字符串,并以正确的顺序进行排序。

字典序排序,从简单的角度来说,就是把所有出现的字符按照字母表的顺序排列,并以此排序来确定字母表中字符出现的次序。

字典序排序将字母表按照字母顺序依次排列,由a开始,最后以z结束,顺序如下:a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z。

字典序排序按照字母顺序来排列,字母表中可有大写字母、小写字母、数字以及其他特殊符号。

由于大写字母的键位在小写字母的键位之前,因此大写字母会被首先显示出来,比如“A-Za-z”,这样先被显示出来的字母就是A,而且,比如“0-9A-Za-z”,这样先被显示出来的字母就是0。

字典序排序可以对英文字母及多种字符进行排列,但是只有当所有字符都处于统一的字符集中才能有效地实施这种排序。

比如,如果所有字符都是中文的话,就不能使用字典序排序法。

字典序排序比较的的是字符的拼写顺序,而不是字符的语义意义。

这种排序方式一般使用于一些信息类或文件文本的参考目录,因为这样可以使用字典序比较查找的效率更高,它广泛地应用在数据库和文件管理领域。

字典序排序与其他排序方式所不同的是,它不会重复叠加排序,即便是在一些特定场景下,字典序在短时间内也能达到排序的效果,它也不消耗多余的时间。

字典序排序是利用字母表对字符进行排序的一种方式,它可以有效的节省时间和空间,提高查找效率,被广泛应用于信息管理、文件组织和文本处理等领域。

字典序排序比较简便,相比其他排序方式,它具有较高的效率,应用范围广泛,因此得到了广大用户的认可。

字典序排序规则

字典序排序规则

字典序排序规则字典序排序规则,也称为字母表排序规则,是指将语文中所有书写单节字(包括汉字和英文字母)按照一定的规则进行排序的一种排序方式。

其中,英文字母按照其所代表的音节从A到Z的顺序进行排列,而汉字按照其在《现代汉语常用字表》中的编号从1到11,035的顺序来排序。

字典序排序规则的由来字典序排序规则也有一定的历史背景:第一个汉字字典,即《说文解字》是由著名汉学家、篆书研究家白求恩在古代经典里发现的,它是中国最早的汉字字典,最早的汉字字典排序规则的基础就是在《说文解字》的基础上进行构建的,当时,按照《说文解字》的排序规则,汉字按照构音节→部首→字形来排列,在实践的过程中受到了很多限制,所以,在20世纪初,英文字典序排序规则出现了。

字典序排序规则的应用字典序排序规则也有广泛应用:例如,在新闻报刊和文学类书籍出版中,经常会用字典序排列文章,不同文章之间的先后顺序便可以很快速、简单地按照字典序列出来;又如,词典、书目及文献的索引等,都会采用字典序排序规则来进行索引查询,以便用户容易、快速地查找某个词条;此外,在编程语言的程序开发中,字典序排序规则也有着广泛的应用,例如,通过字典序排序规则,可以实现文件的快速查找。

字典序排序规则的优点字典序排序规则具有一定的优势:首先,可以满足大多数索引查询的需求;其次,字母表中英文字母的排列是有规律的,而汉字在《现代汉语常用字表》中的编号也是有序的,能够有效地避免汉字书写时的混乱;再次,排序的过程简单易行,可以大大节省排序的时间;最后,字典序排序规则也具有良好的可读性,它能在有限的空间里产生多种排序效果,节约人力和财力。

总结总而言之,字典序排序规则是一种非常有用的排序方式,它受到英文字典序排序规则的启发,通过字母表中英文字母和《现代汉语常用字表》中汉字排列的有序序号,能够有效地缩小排序的范围,满足不同排序需求,具有很强的可读性和可操作性,能够大大节省人力和时间。

第2讲 枚举法中的字典排列

第2讲 枚举法中的字典排列

第2讲枚举法中的字典排知识精讲在之前我们学习了简单的枚举法——直接把所有情况一一列举出来。

如果问题较为复杂,直接枚举有可能产生重复或者遗漏,这时就需要有一些特别的方法来帮助我们枚举出所有情况。

本讲就主要介绍两种枚举的方法:字典排列法和树形图法,今天我们来介绍字典排列法。

同学们可以翻一下英汉字典,不难发现字典中单词排列的规律:整本字典按首字母从a到z排列,首字母相同的单词都在一起。

在首字母相同的单词中,再按照第2个字母从a到z的顺序排列.然后是第3个字母,第4个字母……所谓“字典排列法,就是指在枚举时,像字典里的单词顺序一样排列出所有答案.例如:用1、2、3各一次可以组成多少个不同的三位数?用字典排列法抆举时,每个位置都按从小到大排列,枚举的顺序是:123,132, 213,231,312,321.下面我们用字典排列法来解决几个问题。

例题精讲【例题1】卡莉娅、墨莫、小高三个人去游乐园玩,三人在藏宝屋中一共发现了5件宝物.三人找到的宝物数量共有多少种不同的可能?(可能有人没有发现宝物)(提示:每个人最少找到几件宝物,最多呢?)【练习一】老师准备了6本笔记本奖励萱萱、小高和墨莫三人,每人至少得到1本笔记本,请问:老师有多少种不同的奖励方法?【例题2】老师要求每个同学写出3个自然数,并且要求这3个数的和是8.如果两个同学写出的3个自然数相同,只是顺序不一样,则算是同一种写法.试问:同学们最多能得出多少种不同的写法?(提示:注意顺序不同算一种写法,也就是三个数分别为(1、 2、 5)、(2、 5、 1)和(5、 1、2)都算同一种写法。

)【练习二】三个大于0的整数之和(数与数可以相同)等于10,共有多少组这样的三个数?用字典排列法枚举的时候,判断题目要求到底是“交换顺序后算作两种”还是“交换顺序后仍然是同一种”非常关键.往往题目中要求“交换顺序后仍然是同一种”,那么枚举的每个结果里就没有明确的顺序关系;反之,那么枚举时要注意每个结果中应该都符合一定的顺序关系.在求解计数问题时,审题非常关键,往往一字之差就会有天壤之别.枚举法是解决计数问题的基础,但是对于比较复杂的问题,如果直接枚举很容易出现重复或者遗漏,这时就需要预先把所有情形分成若干小类,针对每一小类进行枚举。

字典顺序0比1小

字典顺序0比1小

字典顺序0比1小
字典排序是一种对于随机变量形成序列的排序方法。

即按照字母顺序,或者数字小大顺序,由小到大的形成序列。

以问题中提到的序列为例,“ilove”的第一个字母是“i”,“baray”的第一个字母是“b",在字母表中,”i“是排到”b“前面的,所以”ilove“就应该排到”baray“前面。

字母表序列:
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z。

字典序:在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法。

这种泛化主要在于定义有序完全有序集合(通常称为字母表)的元素的序列(通常称为计算机科学中的单词)的总顺序。

字典序的形式定义:
给定两个偏序集A和B,(a,b)和(a′,b′)属于笛卡尔积A×B,则字典序定义为:(a,b) ≤ (a′,b′) 当且仅当a<a′ 或(a=a′ 且b≤b′)。

结果是偏序。

如果A和B是全序, 那么结果也是全序。

第二讲 字典排列法与树形图

第二讲 字典排列法与树形图

第二讲字典排列法与树形图知识点总结1、枚举法:字典排列法、分类枚举、树形图都是枚举法中的一种,使用各种枚举法需要注意有条理、不重复、不遗漏,使人一目了然。

2、字典排列法:从首位开始,按一定的顺序(比如从小到大)枚举第一位,对于每种情况再按从小到大的顺序枚举第二位,依次类推。

3、分类枚举:先有序分类,再有序枚举。

4、树形图:确定起点,按照一定的顺序一一罗列,最后数终点个数。

例题精讲【例1】汤姆、杰瑞和得鲁比都有蛀牙,他们一起去牙医诊所看病,医生发现他们一共有8颗蛀牙,他们三人可能分别有几颗蛀牙?【分析】三人情况:都有蛀牙说明每个人的蛀牙数目不能为0,每人至少有1颗,一共有8颗蛀牙,所以最多的蛀牙数是6。

题中有三个人的名字,所以三个人是有次序的,我们将汤姆看成是首位,杰瑞看成第二位,德鲁比看成第三位,则可以运用字典排列法枚举。

汤姆: 1 1 1 1 1 1 汤姆: 2 2 2 2 2杰瑞: 1 2 3 4 5 6 杰瑞: 1 2 3 4 5得鲁比:6 5 4 3 2 1 得鲁比: 5 4 3 2 1汤姆: 3 3 3 3 汤姆: 4 4 4杰瑞: 1 2 3 4 杰瑞: 1 2 3得鲁比:4 3 2 1 得鲁比:3 2 1汤姆: 5 5 汤姆: 6杰瑞: 1 2 杰瑞: 1 得鲁比:2 1 得鲁比:1总共有6+5+4+3+2+1=21种情况。

【例2】下午茶的时候,老师给同学们准备了苹果,香蕉和橘子三种水果,每种都有足够多个,昊昊想挑3个水果吃,请问:他一共有多少中选择?【分析】分类枚举:先有序分类,再有序枚举。

一种水果:苹苹苹,香香香,橘橘橘两种水果:苹香香,苹苹香,苹橘橘,苹苹橘,香橘橘,香香橘三种水果:苹香橘一共:3+6+1=10(种)【例3】一个人在三个城市A、B、C中游览。

他今天在这个城市,明天就必须到另一个城市。

这个人从A城出发,4天后还回到A城,那么这个人有几种旅游路线?【分析】列出树形图如下,共有6种路线。

【思维拓展】小学数学三年级思维拓展之字典排序法(附答案)

【思维拓展】小学数学三年级思维拓展之字典排序法(附答案)

三年级思维拓展之字典排序法
1.用数字1,2,3可以组成多少个不同的三位数?(数字可以重复使用)
2.在某地有1分,2分,4分,8分四种面值的硬币,假如你恰有这四种硬币各1枚。

问共能组成都少种不同的钱数?请你用加法算式一个一个列举出来
3.小悦、东东、阿奇三个人共有7本课外书,每个人至少有一本。

问小悦、东东、阿奇分别有几本课外书?
4.汤姆、杰瑞和得鲁比都有蛀牙,他们一起去牙医诊所看病,医生发现他们一共有8颗蛀牙,他们三人可能分别有几颗蛀牙?
5.设S=1,2,3,4,用字典序法求出S的全部排列。

6.解答下列各题.
(1)用1、2、3三张数字卡片可以组成多少个不同的三位数?
(2)用1、2、3三种数字卡,每种都有足够数量,可以组成多少个不同的三位数?
7.解答下列各题
(1)用数字1、2、3可以组成多少个不同的三位数?
(2)用数字1、3、6可以组成多少个不同的三位数?
(3)数字用1、3、6可以组成多少个不同的无重复数字的三位数?
8.用数字1、2、3可以组成多少个不同的无重复数字的自然数?。

字典序的定义-概述说明以及解释

字典序的定义-概述说明以及解释

字典序的定义-概述说明以及解释1.引言1.1 概述字典序是一种排序方法,它基于字母或数字的顺序,按照从左到右的顺序逐个比较字符或数字的大小。

在字典序中,首先比较第一个字符或数字,如果相同,则继续比较第二个字符或数字,以此类推,直到找到不同的字符或数字为止。

根据比较结果来确定其在序列中的位置。

字典序在日常生活中非常常见,我们在查看字典、电话簿、学生名单等时经常会遇到。

它不仅在实际应用中具有很大的作用,而且在计算机科学中也是一个重要的概念。

字典序的应用非常广泛,如字符串排序、搜索引擎排序算法、数据库索引等。

在字符串排序中,我们可以使用字典序将字符串按照字母顺序进行排序,这对于进行字符串的查找和比较非常有帮助。

在搜索引擎中,字典序能够根据搜索关键词的字母顺序将搜索结果进行排序,提高搜索效率。

而数据库索引则可以使用字典序对数据库中的数据进行排序和查找。

本文将重点介绍字典序的定义和应用,通过对字典序的深入了解,可以更好地理解其在实际生活和计算机科学中的重要性和应用价值。

同时,本文还将展望字典序在未来的发展趋势,探讨其在更多领域中的应用前景。

1.2文章结构1.2 文章结构本文将按照以下结构进行叙述:第一部分是引言。

引言主要包括三个部分:概述、文章结构和目的。

在概述中,将简要介绍字典序的概念和重要性。

文章结构部分将对整篇文章的组织结构进行说明,提供读者整体了解文章脉络的导引。

目的部分说明本文撰写的目的,明确了解字典序定义和应用的重要性。

第二部分是正文。

正文包括两个部分:字典序的定义和字典序的应用。

其中,字典序的定义部分将详细解释字典序的含义、定义和特点。

此部分将探讨字典序如何根据字母表的排列顺序进行排序,以及如何应用于不同的情境中。

字典序的应用部分将探讨字典序在实际生活中的各种应用,如字符串排序、排列组合问题等。

将通过实例和案例来说明字典序在不同领域中的实际应用,并探讨其优势和局限性。

第三部分是结论。

结论部分将总结全文的主要观点和观点。

计数第02讲_字典排列(学生版)A4

计数第02讲_字典排列(学生版)A4

二年级A 班专属讲义 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////---- 1 ----计数第02讲_字典排列(学生版)一.字典排列法 所谓字典排序法,就是指在枚举时,像字典里的单词顺序那样排列出所有答案.例如:用数字4、5、6可以组成多少个不同的三位数.用字典排列法枚举时,每个位置都按从小到大排列,枚举的顺序是:456、465、546、564、645、654.二.枚举中的至多、至少问题根据至多、至少的条件用字典排列法进行分类枚举.三.分类计数枚举法是解决计数问题的基础,但是对于比较复杂的问题,如果直接枚举容易出现重复或者遗漏.这时就需要先把所有情形分成若干小类,再针对每一小类进行枚举.在分类时,一定要注意类与类之间有没有重复和遗漏的情况.重难点:分类的基本原则:不重不漏;枚举时注意审题:判断题目“交换顺序算作两种”还是“交换顺序算作一种”.计数第02讲_字典排列---- 2 ---- 二年级A 班专属讲义////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////计数第02讲_字典排列(学生版)题模一:字典排列法例 1.1.1从1,2,3,4,5,6中任意选出三个不同的数字,使它们的和为偶数,一共有___________种不同的选法.例1.1.2有面值分别为1元、10元和50元的纸币若干,每种面值的纸币张数都大于3.如果从中任取3张,那么能组成的钱数共有_______种.例1.1.3满足下面性质的数称为好数:它的个位比十位大,十位比百位大,百位比千位大,并且相邻两位数字的差不超过2.例如1346、3579为好数,而1456就不是好数,那么一共有________个四位数是好数.题模二:枚举中的至多、至少问题例1.2.1妈妈买来4个鸡蛋,每天至少吃1个,至多吃2个,吃完为止,如果天数不限,共有__________种不同的吃法.例1.2.2白雪公主要吃完10个相同的苹果,每天至少吃3个苹果,所吃天数不限,一共有__________种不同的吃法.例1.2.3张奶奶去超市买了12盒光明牛奶,发现这些牛奶需要装在2个相同的袋子里,并且每个袋子最多只能装10盒.张奶奶一共有__________种不同的装法.题模三:分类枚举例 1.3.1张阿姨要从苹果、梨、橘子、桃中挑2个水果来吃,每种水果都有很多个,共有__________种不同的挑法.例1.3.2王老师准备去打羽毛球,他拿了3个一模一样的球桶,每个球桶最多能装8个羽毛球.他数了一下,发现3个球桶里面一共有16个羽毛球.请问:3个球桶里面可能分别有几个羽毛球?随练1.1用1、2、3这三个数字可以组成___________个三位数.随练1.2一个口袋中有5枚面值1元的硬币和6枚面值5角的硬币,小明随意从口袋中摸出6枚,那么这6枚硬币的面值的和有__________种.随练1.3从1至9中选出3个不同的数字组成一组,并且三个数字的和大于18,求一共有多少种方法?随练1.4盘子里一共有20颗花生,小高和墨莫一起吃.每人一口吃2颗,两个人一起把花生吃完(每人至少吃一口).请列举出他们吃花生数量的所有情况.二年级A 班专属讲义 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////---- 3 ---- 计数第02讲_字典排列(学生版) 随练1.5老师要求墨莫把一篇英语课文抄写4遍,每天至少写1遍.那么墨莫完成这些课文共有_______种不同的可能.随练 1.6有一次,著名的探险家大米得到了一个宝箱,但是宝箱有密码锁,密码锁下边有一行小字:密码之和大于11的两个数字,而且这两个数字不能相同.不能考虑数字的先后顺序,你知道密码共有多少种可能吗?随练1.7小李摆摊卖货,小木偶每个卖1元,大木偶每个卖2元.他今天一共卖出了5个木偶.小李今天一共可能卖了多少钱?作业1从3个1,2个2,1个3中选出3个数字可以组成___________个不同的3位数.作业2刘老师在一个星期中要去3次健身馆,但是为了防止运动过量,不能连续两天都去.刘老师一共有多少种满足条件的时间安排?作业3有4支完全相同的铅笔要分给3位同学,每位同学至少分1支,共有_______种不同的分法.作业4有16道题,每天至少做6题,做完为止,如果天数不限,共有__________种不同的做法.作业5在所有三位数中,各位数字之和不超过4的共有__________个.作业6如果只能用1元、2元、5元的纸币付款,那么要买价格是13元的东西,一共有___________种不同的付款办法.(不考虑找钱的情况)作业7如图,一只小蚂蚁要从一个正四面体的顶点A 出发,沿着这个正四面体的棱依次走遍4个顶点再回到顶点A .这只小蚂蚁一共有___________种不同的走法.12 3 45 6 78 9 DAB C。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对于使用递归解决排列和组合的问题,俺看了很多篇参考资料,可惜的是有点难以理解别人的写法,跟MSDN一样,字都是中文,可是合起来就不知道是啥意思了,同样都是代码,每一句都能看明白,可就是不知道,他在这里为啥要写这一句,这一句在整个程序中的地位,还是脑子不好使,中学的时候数学没学好,这么些年又没好好的锻炼脑子,生锈了。

对于全排列来说,咱们还是从最简单的开始吧。

序列中只有一个元素:那么全排列就只有一种,{1}就是这个序列本身。

序列中有两个元素:那么全排列有两种方式,{1,2},{2,1}。

序列中有三个元素:那么全排列有六种方式,{1,2,3},{1,3,2},{2,1,3},{2,3,1},{3,1,2},{3,2,1}。

如果将排列的结果做成一个整数的话,那么对于三个元素的全排列结果应该是:{123},{132},{213},{231},{312},{321},这六个数有没有什么特点?当然有。

1.它们都是由1,2,3这几个字符组成的。

2.3>2>1。

3.123<132<213<231<312<321。

这个垃圾结论能替我们解决问题吗?当然能。

还记得我们怎么理解二进制的吗?还记得我们怎么理解八进制的吗?还记得我们怎么理解十六进制的吗?二进制中包含两个字符:0,1。

八进制中包含八个字符:0,1,2,3,4,5,6,7。

十六进制中包含十六个字符:0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F。

俺的乖乖,数字么呢?字母都来咧,那些个A呀,B呀,C呀,只是一些符号而已,它们在十六进制中代表的是10,11,12,13,14,15而已。

为嘛非得用ABCDEF呢?能不能用其他的字符呢?当然可以。

甚至于我们把ABCDEF可以改成“啊吧才的饿飞”,只有它依然代表的是10,11,12,13,14,15就行了。

为嘛会用的上ABCDEF呢?呵呵,简单了,因为咱们平常用的数字中没有一个单独的符号用来表达10,11,12,13,14,15而已,咱们为这些值找了个代表而已。

好了,扯的够远了,往回扯。

回到八进制中,为嘛八进制中没有ABCDEF呢?简单的回答是:咱们平常用的数字可以完全拿来表达八进制中的每个单独的数字,就是说,够用了,用不着折腾了复杂的回答是:可以有ABCDEF这些字母,反正这些字母仅仅是个代表而已。

改成{1,2,3,4,5,6,7,8}行不?当然行。

不就是个符号么。

二进制的改成{1,2}行不,也行;改成{2,3}行不,也行。

无论是{1,2}还是{2,3}仅仅是个符号,咱们要做的工作是保证符号中的大小关系,比如1<2,2<3就行了。

那么再次变态一点:{1,4}行不?当然行,对于二进制来说,只要1<4就行了。

那么{3,8}也行喽?当然。

好了,我们已经够变态的了,不妨再变态一点。

既然都已经有了二进制,八进制,十六进制,为嘛不能整个三进制呢?三进制中有几个符号呢?根据二进制,八进制,十六进制推理而来,三进制当中肯定有三个符号。

那是那三个呢?呵呵,你喜欢哪三个呢?俺喜欢{0,1,2}行不?行,呵呵,这娃还比较传统。

那俺要是喜欢{1,2,3}行不?行,呵呵,娃可教也。

二进制中的两位数有哪些啊(使用的符号为{0,1})?不就是:10,11,01,00么。

那么数字不重复的两位数的二进制数有哪些?不就是:10,01么,00和11都有重复。

对于三进制中的不重复的三位数有哪些呢?不就是:{123},{132},{213},{231},{312},{321}。

可是还有很多三位数没写出来呢?知道。

按照完全的三进制来说,123的下一个数字应该是131。

可是如果我们手头的可以使用的字符有限,不是每个字符都可以使用很多次的话,那我们的三位数的序列就应该是{123},{132},{213},{231},{312},{321}。

如果我们将{123},{132},{213},{231},{312},{321}看做连续的三位数,那么{123}<{132}<{213}<{231}<{312}<{321},那么比123大的下一个数就是132,比132大的下一个数就是213......到了这里,我们的结论是什么?结论是:如果要做n个元素的全排列,那么排列的结果一定是一组用n个元素表达的数字的数组,而且每个数字中用上了这n个元素,没有遗漏,没有重复,而且这个数组应该是升序的(或降序),第一个数字小于第二个数字,第二个数字小于第三个数字......第n-1个数字小于第n个数字。

目标有了,现在必须得想办法拼出咱们的目标。

抽象一下问题:如果我们已经有了一个数字了,通过什么手段得到一个比这个数字大一点点的新数字。

如果我们能解决这个问题,再次将新数字作为基础,找一个比新数字大一点点的新新数字。

剩下的工作就是使劲循环,这样我们就可以找到从某个数字开始的所有的比它大的数字了。

那啥时候可以停止了呢?直到找不到一个比现有数字还大的数字,就结束,换种说法,直到找到的数字是最大的。

使用给定的那么几个元素怎么能排出来一个最大的数字呢?呵呵,这不就很简单么。

把最大的元素放在最高位,把次大的放在第二位,把次次大的放在第三位......把最小的放在最低位。

呵呵,看懂了没?不就是一个将所有的元素以降序方式排列么。

如果我们要全排列,那就应该从最小值跑到最大值就可以了,最大值就是降序排列,那最小值很显然的应该是升序排列。

还是从实例开始吧。

二进制:最小值是01,最大值10;分析出从小数得到大数的过程中一定有交换。

三进制:{1,2,3,}{1,3,2,}:有交换,交换2,3。

{2,1,3,}:有交换,交换的比较复杂。

{2,3,1,}:有交换,交换1,3。

{3,1,2,}:有交换,交换的比较复杂。

{3,2,1,}:有交换,交换1,2。

中间有两步“交换的比较复杂”,比较难于总结,先放下。

四进制:{1,2,3,4,}{1,2,4,3,}:有交换,交换3,4。

{1,3,2,4,}:有交换,交换的比较复杂。

{1,3,4,2,}:有交换,交换2,4。

{1,4,2,3,}:有交换,交换的比较复杂。

{1,4,3,2,}:有交换,交换2,3。

{2,1,3,4,}:有交换,交换的比较复杂。

{2,1,4,3,}:有交换,交换3,4。

{2,3,1,4,}:有交换,交换的比较复杂。

{2,3,4,1,}:有交换,交换1,4。

{2,4,1,3,}:有交换,交换的比较复杂。

{2,4,3,1,}:有交换,交换1,3。

{3,1,2,4,}:有交换,交换的比较复杂。

{3,1,4,2,}:有交换,交换2,4。

{3,2,1,4,}:有交换,交换的比较复杂。

{3,2,4,1,}:有交换,交换1,4。

{3,4,1,2,}:有交换,交换的比较复杂。

{3,4,2,1,}:有交换,交换1,2。

{4,1,2,3,}:有交换,交换的比较复杂。

{4,1,3,2,}:有交换,交换2,3。

{4,2,1,3,}:有交换,交换的比较复杂。

{4,2,3,1,}:有交换,交换1,3。

{4,3,1,2,}:有交换,交换的比较复杂。

{4,3,2,1,}:有交换,交换1,2。

从简单的交换看,每次交换都是把大的数交换到前面了,小的数交换到后面了,如果规律相同的话,那么“有交换,交换的比较复杂。

”也应该遵循将大的数交换到前面,小的数交换到后面。

那我们随便找一个“有交换,交换的比较复杂。

”过程来详细分析。

比如从{3,1,4,2,}怎么到的{3,2,1,4,},先找到不动的元素3,反正它没有参与交换,所以,干掉它;问题简化为:{1,4,2}怎么到的{2,1,4},根据交换的规律,一定是大的向前,小的向后。

咱们从后向前看,前面的元素有没有比后面小的?有,谁?1么,那1应该和谁换,应该和比1大的最小的那个进行交换,那这个数是谁?是2,那就换吧,换完的结果是{2,4,1},这个结果和咱们的目标有一点点差别,就是1和4的位置有差别,咱们的目标是{2,1,4},可是中间结果是{2,4,1},那很容易啊,不就是把刚才中间结果中的1和4换一下就OK了。

问题在于:为嘛要换呢?回到咱们的目标上,咱们想找一个数,比142稍微大一点点的数,不是找一个比142大很多的数,在得到全排列的过程,其实是一个将数组的元素从升序更改到降序的过程,如果没有完全排好的话,那么一定有左侧元素小于右侧元素的现象,在找到的左侧元素的右边一定是已经降序排列的,要找一个比当前数大的数,那可以将找到的左侧元素和右侧序列中的一个元素进行交换,以达到比原数大的效果,可是选哪个元素呢?只能选一个比左侧元素还大的元素交换过去才能比原来的数大,那么这样交换完成的数的确比原来的数大;但是不是仅仅大于原来的数吗?呵呵,难说,因为左侧元素的右侧已经以降序的方式排列,那么它们组成的数字肯定不是较小的数字,而是较大的数字,怎么能让这个数字是个比原数稍微大一点点的数呢?交换完成以后,将左侧元素右边的所有数字直接从降序改成升序,不就是一个较小的数了么。

总结总结。

1.从右向左找,找到第一个比下一个元素还小的地方,记下位置,标注为左元素。

2.从右向左找,找到第一个比左元素大的元素,记下位置,标注为右元素。

3.交换左元素和右元素。

4.不管现在左元素位置上放的是谁,将左元素右边的序列逆序。

5.这样就得到了一个新数了。

6.可以继续重复1-5,来继续得到下一个排列。

7.如果再也找不到一个比下一个元素还小的地方,那么意味着这个序列已经降序了,排列完成了,那就结束吧。

可算到代码实现了。

static void Main(string[] args){int[] ary ={ 1, 2, 3,4 };while (true){Print(ary);if (!Next(ary)){break;}}}static void Print(int[] ary){Console.Write("{");for (int i = 0; i < ary.Length; i++){Console.Write("{0},", ary[i]);}Console.Write("}");Console.WriteLine();}static bool Next(int[] ary){//因为序列一开始是升序的,等排序完成以后就应该是降序的//所以排完的标志是序列中从后向前找,找不到后面比前面大//的元素,如果真的找不到了,那就结束了。

int leftIndex = -1;for (int i = ary.Length - 1; i > 0; i--){if (ary[i - 1] < ary[i]){leftIndex = i - 1;break;}}//找不到了,那就结束了if (leftIndex < 0){return false;}//如果能运行到这里,说明序列还没有被完全排完 //还有后面比前面大的情况//下面的工作是从序列的后面向前面找,找到刚才 //leftIndex的位置就结束了;找什么呢?找一个比 //leftIndex还大的元素,也就是在已经降序排列的 //那一部分中找一个比leftIndex还大的元素,这个 //一定能找到。

相关文档
最新文档