当前位置:文档之家› 【IT专家】实现全排列的两种算法:字典序列法以及递归算法(java)

【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,。

相关主题