全排列(字典序法)
package pers.menix.algorithm;
public class FullPermutation {
/**
* author:menix
* 输出全排列(字典序法)
*/
public static void main(String[] args) {
int arr[] = new int[] {1,2,3,4,5,6};
sort(arr);
// 求全排列并输出
int count = 1;
while (nextPermutation(arr)) {
for (int arrary : arr)
System.out.print(arrary + "");
System.out.println();
count++;
}
System.out.println("共" + count + " 个");
}
/**
* @param arr当前数组序列
* @return 字典序中的下一个序列,没找到则返回false */
public static boolean nextPermutation(int[] arr) {
int f = 0, s = 0;
boolean find = false;
// 从右向左找出满足arr[i] < arr[i + 1]的i
for (int i = arr.length - 2; i >= 0; i--)
if (arr[i] < arr[i + 1]) {
f = i;
find = true;
break;
}
if (!find)
return false;
// 从s向后找出最小的满足arr[i] >= arr[f]的i
int min = arr[f];
for (int i = f + 1; i < arr.length; i++) {
if (arr[i] >= arr[f]) {
min = arr[i];
s = i;
}
}
// 交换f与s位置上的值
int temp = arr[f];
arr[f] = arr[s];
arr[s] = temp;
// 对f后面的所有值做逆序处理(转置)
int i = f + 1;
int j = arr.length - 1;
for (; i < j; i++, j--) {
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
return true;
}
/**
* 对数组做升序排序
*
* @param arr重排序数组
*/
public static void sort(int[] arr) {
for (int i = 0; i < arr.length - 2; i++)
for (int j = 0; j < arr.length - i - 1; j++)
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
运行结果:
第三讲 排序算法(7.28语言提高班)
第三讲排序算法(7.28)(语言提高班) 目录 训练1.明明的随机数(Noip2006普及组第1题) (1) 训练2.众数(masses.cpp) (2) 训练3.车厢重组(carry.cpp) (2) 训练4.军事机密(secret.cpp) (2) 训练5.排名 (3) 训练6.奖学金(Noip2007 普及组第1题) (3) 训练7.统计数字(Noip2007) (5) 训练8.输油管道问题 (5) 训练9.奇数单增序列 (6) 训练10.整数奇偶排序 (6) 训练11:合影效果 (7) 训练12:分数线划定 (7) 训练13:病人排队 (8) 训练14:单词排序 (9) 训练1.明明的随机数(Noip2006普及组第1题) 【问题描述】 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 【输入文件】 输入文件random.in 有2行, 第1行为1个正整数,表示所生成的随机数的个数:N 第2行有N个用空格隔开的正整数,为所产生的随机数。 【输出文件】 输出文件random.out 也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 【输入样例】 10 20 40 32 67 40 20 89 300 400 15 【输出样例】 8 15 20 32 40 67 89 300 400
排列句子顺序练习附答案
小学语文句子排序练习题02 1() ()碧溪河从村前流过。 ()村后是一望无际的桑园。 ()我家住在碧溪河边,这是江南水乡的小村庄。 ()河里一群小鱼在水中游来游去,水面上不时溅起朵朵水花。 ()春天,桑树抽出新芽,整个桑园就像绿色的海洋。 2() ()一些不知名的小花,长在绿草中,像蓝天上缀着的星星。 ()小花园在教室的左边,长八米,宽四米。 ()花园里四周的道路上都长满了青草,好象铺了一层绿毯。 ()它紧靠短墙,由一排横、两排竖的篱笆和这面短墙围起来。 ()花是老师精心栽培的,有的长在地上,有的长在盆里,构成了一个个图案。 ()到了夏天,大的、小的、圆的、长的、各种形状的绿叶,托着红的、黄的、蓝的、白的各色各样的花儿,美丽极了! 3() ()地上的水越来越多。 ()雨落在对面的屋顶的瓦片上。 ()像一层薄烟罩在屋顶上。 ()渐渐地连成了一条线。 ()溅起一朵朵水花。 ()雨水顺着房檐流下来。 ()汇合成一条条小溪。 ()开始像断了线的珠子。 4() ()王红同学真值得我们学习。 ()今天,老天爷一直紧绷着脸,阴沉沉的,好象跟谁生气似的。 ()就在这个时候,我看见一个女同学飞快地朝操场奔去。 ()天突然下起雨来。 ()啊!那是三年级(4)班的王红。 ()下午放学的时候,同学们背起书包正准备回家。 ()原来,她是冒雨去降国旗的。
()红领巾在她胸前飘动,就像一束跳动的火苗。 5() ()我们坐在河边柳树下,放下了鱼钩。 ()忽然,浮标一沉,我急忙把鱼竿往上一提,一条银白色的小鱼钓上来了。 ()星期天早晨,我和小明扛着鱼竿到郊外去钓鱼。 ()浅红色的浮标漂在水面上。 ()我们高兴地把鱼竿举在空中,摇晃着,喊着:“我们钓着鱼了!” 6() ()他正想坐下时,管理员对他说:“先生,请你不要坐在这里,这里是马克思的座位。” ()管理员笑着说:“是的,很多年来,他每天都到这里来读书。” ()那个读者问:“他每天都来吗?你是说他今天一定会来?” ()话刚说完,马克思果然跨进门来了。 ()一天清早,伦敦大英博物馆里,有位读者看见有个座位空着,便走了过来。 7() ()我连忙站起来让老爷爷坐。 ()我刚坐下,一位老爷爷提着篮子上了车。 ()星期日,我坐汽车去奶奶家。 ()老爷爷微笑着说:“谢谢,你真是个好孩子。” ()上车后,我找到一个座位。 ()我说:“不用谢,这是我应该做的。” 8() ( ()奶奶说:“这孩子到底长了一岁,懂事多了。” ()奶奶乐呵呵地从怀里掏出一个红包,说是给我的压岁钱。 ()屋子里充满了欢声笑语。 ()我奔到奶奶身边,祝奶奶健康长寿。
【IT专家】实现全排列的两种算法:字典序列法以及递归算法(java)
本文由我司收集整编,推荐下载,如有疑问,请与我司联系实现全排列的两种算法:字典序列法以及递归算法(java)2014/10/19 0 一.全排列之字典序列法 /** * 这是一个实现全排列的字典序列算法,可适用于有数据重复以及无数据重复 的字符串----注意:字符要先从小到大排序* 算法描述:例如:645321 的下一个数: * 1.左边的数要大于右边:从最右- 最左,遍历查询是否有邻近左边的数小于右边的 数,有就停止遍历,本例:4 5. * 2.把找到的左边那个数,与其右边的所有数比较,从 右向左逐一比较,找到第一个比它大的,然后交换。本例:比4 大的右边第一个数 是5. * 3.将两个数对换,则字符可分为65,4321,把4321 从小到大排序:1234* 4. 下一个字符序列是:651234. span > * * @param ary //要排列的数组*/public static void dictorySerial(int[] ary1) {Arrays.sort(ary1);System.out.println( 1: + Arrays.toString(ary1));int i = 2;while (true) {int j;for (j = ary1.length - 1; j j--) {if (ary1[j - 1] ary1[j]) {for (int k = ary1.length - 1; k j - 1; k--) {if (ary1[k] ary1[j - 1]) {int temp = ary1[j - 1];ary1[j - 1] = ary1[k];ary1[k] = temp;break;}}int[] ary2 = new int[ary1.length - j];System.arraycopy(ary1, j, ary2, 0, ary2.length);Arrays.sort(ary2);System.arraycopy(ary2, 0, ary1, j, ary2.length);System.out.println((i++) + : + Arrays.toString(ary1));break;}}if (j == 0) {break;}}}二.全排列之递归算法 /** * 这是关于java 全排列的递归算法,本算法不适用于字符串中有重复数字。- --注意:交换两个数后,后面要在交换过来,不要影响要排列的字符序列(*)* 算法过程:如:123 的全排列:* 1.可以看成:以1 开头的全排列,以2 开头的全 排列,以3 开头的全排列/span 表示成1(23),2(13),3(12)的全排列,即23 全排列,13 全排列,12 全排列. span > span > span > span > span > span > span > span > span > span > span > span > span >public static void recurrence(int[] ary2, int start, int end) {if (start == end) {System.out.println((++i) + : + Arrays.toString(ary2));} else {for (int i = start; i = end; i++) {swap(ary2, start, i);recurrence(ary2, start + 1, end);swap(ary2, start, i);System.out.println(Arrays.toString(ary2));}}}public static void swap(int[] ary2, int start,
查字典技巧口诀及三种方法
小学生查字典口诀 学查字典并不难,偏旁部首看端详。 没有部首查起笔,形声字儿查形旁; 头底两层是部首,要让字头当偏旁; 左右两边是部首,取左去右有保障; 内心外壳是部首,舍去里边查外框; 整个字儿是部首,此字本身是偏旁; 一字头上生“二角”,取其下底把“角”砍; 下底如果不成部,左上角当此字旁; 有些生字较特殊,顶天立地当偏旁; 多查多想抓规律,相同部首不能忘。 查字典常用的三种方法是: 音序查字法、部首查字法和数笔画查字法。 ?如果很容易确定部首,但不确定读音就可以用部首查字法;?如果知道读音,但不会写这个字,就用音序查字法; ?如果是独体字就用数笔画查字法。
字、词典是无声的老师,这位老师随时会帮你解决疑难,扫除 学习中的“拦路虎”。你会只花少量的时间,非常方便地得到 较多、较全面、较准确的知识。熟练查字、词典,首先要学会 检字。下边以《新华字典》为例介绍这几种查字法。 一、音序查字法 音序检字法是按字音查字词的一种方法。很多字典或词典是按汉语拼音字母的顺序编排的。根据一个字的汉语拼音第一个字母,就可以在“汉语拼音音节表”中找到这个字的拼音音节在正文中的页码,再按照这个字的声调到那一页中去找。凡是要查只知道读音而不知道写法或意义的字,都可以用这种方法,但必须熟悉汉语拼音字母顺序和汉语拼音音节。 运用条件: ①字音要读得正确; ②准确无误地了解这个字的声母、韵母; ③掌握字母的写法。 知道了这个字的读音,不知道它的写法,或不知道它的意思, 就必须运用音序查字法查字。 查字步骤: ①确定音部。按要查字的读音确定音节的第一个字母——音部。
②查音节索引。在《汉语拼音音节索引》中所确定的音部栏里,找出要查字的音节,并看准该音节后面所标的正文页码。 ③翻阅正文。按页码翻阅正文,找出要查的字。 在学习中遇到不理解的字或不会写的字,只要能读准字音,就可以运用音序检字法去查检。 下面的歌诀,可以帮助同们掌握这种检字法: 音序检字须认真,读准字音很要紧。 打头字母定音部,再找音节看《索引》; 按照例字找同音,对照页码翻正文; 根据声调找汉字,字形字义记在心。 部首检字法:部首检字法属于按形查字中的一种方法。它是根据汉字的部首去查检的。凡字典正文中的单字是按部首归类进行排列的,都可以运用部首检字。 部首检字的基本步骤? ⑴确定出部首。先对所要查的字确定出查什么部。 ⑵查《部首目录》。在《部首目录》中查出该部首在《检字表》中的页码。 ⑶查《检字表》。按照页码在《检字表》中这个字的余画(即除去部首还余几画)里查出这个字在字典正文中的页码。
2枚举法中的字典排列
第2次课枚举法中的字典排列 小热身 体会一下,“分给两个人”和“分成两堆”有什么区别呢? (1)把5个苹果全部分给两个人,共有多少种不同的分法? (2)把5个苹果分成两堆,共有多少种不同的分法? 例题1:卡莉娅、墨莫、小高三个人去游乐园玩,三人在藏宝屋中一共发现了4件宝物,三人找到的宝物数量共有多少种不同的可能?(可能有人没有发现宝物) 练习1:老师准备了6个笔记本奖励萱萱、小高、墨莫三人,每人至少得到1本笔记本,请问:老师有多少种不同的奖励方法? 例题2:老师要求每个同学写出3个自然数,并且要求这3个数的和是8。如果两个同学写出的3个自然数相同,只是顺序不一样,则算是同一种写法。试问:同学们最多能得出多少种不同的写法? 练习2:三个大于0的整数之和(数与数可以相同)等于10,共有多少组这样的三个数?
例题3:如下图所示,有7个按键,上面分别写着1、2、3、4、5、6、7这七个数字。请问: (1)从中选出2个按键,使它们上面的数字的差等于2,一共有多少种选法? (2)从中选出2个按键,使它们上面的数字的和大于9,一共有多少种选法? 练习3:有一次,著名的探险家大米得到一个宝箱,但是宝箱有密码锁,密码锁下面有一行小字,密码是和大于11的两个数,而且这两个数不能相同,不用考虑数的先后顺序,你知道密码共有多少种可能吗? 例题4:如图,数一数图中包含星星的长方形(包括正方形)有多少个? 练习4:如图,数一数图中包含星星的正方形有多少个?
作业: 1、有4支完全相同的铅笔要分给3位同学,每位同学至少分1支,共有多少种不同的分法? 2、有面值分别为1元、10元和50元的纸币若干,每种面值的纸币张数都大于 3、如果从中任意取3张,那么能组成的钱数共有多少种? 3、从1、2、3、 4、 5、6这六个数字中选出2个数字,使它们的数字的差等于2,一共有多少种选法? 4、数一数,下图包含星星的长方形(包括正方形)有多少个? 5、在下图中,一共能找出多少个含“☆”的三角形。
排列的字典序问题
算法分析与设计实验报告 第 2 次实验
这次的实验和上一次的字典序问题有一些相似,主要不同的地方在于要写出下 附录:完整代码 #include