首页 > 编程知识 正文

递归算法面试题,全排列递归算法java实现

时间:2023-05-03 22:50:04 阅读:174745 作者:2309

全排列算法-递归字典序实现

全排列

从n个不同的元素中任意取m(czdzjy )个元素,按一定的顺序排列,叫做从n个不同的元素中取出m个元素的一个排列。 当m=n时,所有的排列情况称为全部排列。

例如:

1、2、3三种元素的全部排列如下。

{ 1,2,3 },{ 1,3,2 },{ 2,1,3 },{ 3,1,2 },{ 3,2,2,2,2 }。

解法1(递归)

下图:要对1、2、3、4进行排序,第一个位置的元素有四种可能: 1、2、3或4。 如果发现第一个元素是4,则剩下的第二个位置有1、2、3。 很明显,这具有递归结构。 如果原始数组的顺序是1、2、3、4,现在只需要分别交换1、2、3、4

代码:

public void permutation (charchs [ ],int start ) if ) start==CHS.length-1 ) Arrays.tostring ) CHS ); //如果成为数组的最后一个要素,前面的要素排列并输出。 }for(intI=start; i=chs.length-1; I )//将第一个元素分别与后面的元素交换,递归地调用其子数组进行排序swap(CHS,I,start ); permutation(CHS,start 1); SWAP(CHS,I,start ); //子数组排序返回后调换第一个元素。 //如果不交换就回来的话会出错。 例如,最初的1,2交换是最初的位置为2,子数组的排序返回后没有进行1,2//交换就返回,在第二次交换时交换2,3,所以1,2交换必须保持在最初的位置。) public void swap (ccom temp=chs[i]; chs[i]=chs[j]; chs[j]=temp; }递归方法交换重复元素。 例如,使用递归对{ 1,1 }进行所有排序时,将输出{ 1,1 }、{ 1,1 }两个重复的结果。 要在排序时删除重复结果,请按如下方式修改代码:

publicstaticvoidpermutation (charchs [ ],int start ) if ) start==end ) list.add ) newstring ) CHS ); }for(intI=start; i=chs.length-1; I ) if(I==start|||CHS[I]!=CHS[start](//并排时判断,如果后面的要素与start相同,则不进行排序。 //这样可以避免重复要素的排序swap(CHS,I,start )。 permutation(CHS,start 1); SWAP(CHS,I,start ); } } } 解法2(字典序法)

字典序法

对给定字符集的文字确定优先关系,然后规定2个全部排列的优先是从左到右各对应一个文字的优先。

像列一样,对a、b、c进行了排序,结果是{a、b、c}、{a、c、b}、{b、a、c、a}、{c、b}、{c、b}、{c、b}

字典顺法的优点是按顺序输出数组的结果,对重复的要素不进行重复排序。

字典排序法的思想:

例如,对元素1、2、3、4进行排序,假设默认数组顺序为{1、2、3、4},然后先输出第一个数组1、2、3、4。 然后,从右到左找到第一个未递增的数,4,3。 因为3小于4,所以要更换3、4。 然后,按相反的顺序排列3后面的数。 第二列是{ 1,2,4,3 },从右到左找到3,4,2。 2小于4,交换后,从右向左找到第一个大于2的数。 {1、更换后

在数组成为完全递减的数组之前,依次循环结束1、2、3、4词典排序的最大序列为{ 4,3,2,1 }。

代码

publicvoidpermutationwithdictionary (charchs [ ] ) arrays.sort CHS; //按顺序排列数组元素的while(true ) system.out.println (CHS ); int j=chs.length-1; int index=0; for(j=CHS.Length-2; j=0; j--}{if(CHS[j]CHS[j1]}{index=j; 黑; //从右到左找到第一个未增量的元素(elseif ) j==0) { return; }for(j=CHS.Length-1; j=0; j--}{if(CHS[j]CHS[index] ) break; //从右到左,找到大于非增加元素第一个元素(swap(CHS,index,j ); //替换找到的两个元素的reverse(CHS,index 1); //按相反顺序排列非增量元素位置后面的数组} publicstaticvoidreverse (charchs [ ],int i ) int i,j=chs.length-1; while(kj ) swap (CHS,k,j ); k; j----; } publicstaticvoidswap (charchs [ ],int i,int j ) { char temp; temp=chs[i]; chs[i]=chs[j]; chs[j]=temp; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。