Java全排列递归算法

Java全排列算法:算法

第一遍循环:将list数组index==0的元素依次与数组的每一个元素交换,从而保证index==0的位置前后出现n个不一样元素之一,实现对index==0位置的遍历。数组

第 i 遍循环:经过交换,  使index==i的元素,依次与index 为[ i, length-1] 的元素交换。使index==i 位置遍历 length-i 个不一样值spa

第k 次遍历,实质上都是让子列表[ k,  length - 1] 的index==0 的位置依次出现length - k 个不一样的值,并在出现每一个不一样的值时,递归操做子列表[ k+1, length - 1]code

public class Permutation {

    public static void permulation(int[] list, int start, int length) {
        int i;
        if (start == length) {
            for (i = 0; i < length; i++)
                System.out.print(list[i] + " ");
            System.out.println();
        } else {
            for (i = start; i < length; i++) {
                swap(list, start, i);
                permulation(list, start + 1, length);
                swap(list, start, i);
            }
        }
    }

    public static void swap(int[] list, int start, int i) {
        int temp;
        temp = list[start];
        list[start] = list[i];
        list[i] = temp;
    }

    public static void main(String[] args) {
        int length = 3;
        int start = 0;
        int list[] = new int[length];
        for (int j = 0; j < length; j++)
            list[j] = j + 1;
        permulation(list, start, length);
    }

}

没有注释,其实由于我以为注释也不太好写。以list[3]={1,2,3}为例。blog

1、先是123,而后1与1本身对换,递归排列23,2与2本身对换,递归排列3,而后3与3对换,再递归时知足start==length,即越界,因此把123打印出来;递归

而后上一步2与2本身对换后,2与3对换,(暂时是132),递归到2与2对换,再递归知足start==length,打印132;io

2、最早一步1与1本身对换后,1与2对换,(暂时是213),递归排列13,1与1本身对换,递归排列3. 3与3本身对换,而后知足If条件打印213:class

而后退一步,1与3对换,(暂时是231),递归到1与1本身对换,再递归知足打印条件,打印231;循环

3、1与一、2对换后,1最后与3对换,(暂时是321),递归排列21,2与2对换,递归排列1.1与1本身对换,后来知足打印条件打印321. 2再与1对换,再递归到2与2本身对换,后来打印出312.遍历

写得比较抽象,但只能这样了。只可意会,不可言传~

相关文章
相关标签/搜索