利用Java如何实现全排列算法和递归?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
<强>全排列:强>
从n个不同元素中任取米(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。
例如:
{1,2,3}, {1, 3, 2}, {2, 1, 3}, {2、3、1}, {3 1 2}, {3,2,1}。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
如下图:要对1,2,3,4进行排序,第一个位置上的元素有四种可能:1或2或3或4,假如已经确定了第一个元素为4,剩下的第二个位置上可以是1,2,3,很显然这具有递归结构,如果原始要排列的数组顺序为1,2,3,4,现在只要分别交换1、2、1、3、1、4然后对剩下的3个元素进行递归的排列。
<强>代码:强>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
公共静态孔隙排列(char chs [], int开始) { 如果(开始==结束) { 列表。添加(新的字符串(chs)); } for (int i=开始;i<=chs.length-1;我+ +) { 如果我==| | chs[我]!=chs[开始]) {//在排列的时候进行判断如果后面的元素与开始相同时就不进行排序。//这样就可以避免对重复元素进行排序 交换(chs,我,开始); 排列(chs,开始+ 1); 交换(chs,我,开始); } } }
对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。
列如:对a, b, c进行排序的结果是{a, b, c}, {a, c, b}, {b, a、c}, {b, c,}, {c, a、b}, {b, c}
字典序法的优点是排列的结果按照顺序输出并且对于重复的元素不进行重复排序。
例如:对元素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,3,4,2}再对3后面的数进行逆序排列第三个序列为:{1、3、2、4}
依次循环直到数组成为完全递减数组结束1,2,3,4字典排序的最大序列为{4、3、2、1}。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
代码
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
利用Java如何实现全排列算法和递归