Java全排列遞歸算法


Java全排列算法:

第一遍循環:將list數組index==0的元素依次與數組的每個元素交換,從而保證index==0的位置先后出現n個不同元素之一,實現對index==0位置的遍歷。

第 i 遍循環:通過交換,  使index==i的元素,依次與index 為[ i, length-1] 的元素交換。使index==i 位置遍歷 length-i 個不同值

第k 次遍歷,實質上都是讓子列表[ k,  length - 1] 的index==0 的位置依次出現length - k 個不同的值,並在出現每個不同的值時,遞歸操作子列表[ k+1, length - 1]

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}為例。

一、先是123,然后1與1自己對換,遞歸排列23,2與2自己對換,遞歸排列3,然后3與3對換,再遞歸時滿足start==length,即越界,所以把123打印出來;

然后上一步2與2自己對換后,2與3對換,(暫時是132),遞歸到2與2對換,再遞歸滿足start==length,打印132;

二、最先一步1與1自己對換后,1與2對換,(暫時是213),遞歸排列13,1與1自己對換,遞歸排列3. 3與3自己對換,然后滿足If條件打印213:

然后退一步,1與3對換,(暫時是231),遞歸到1與1自己對換,再遞歸滿足打印條件,打印231;

三、1與1、2對換后,1最后與3對換,(暫時是321),遞歸排列21,2與2對換,遞歸排列1.1與1自己對換,后來滿足打印條件打印321. 2再與1對換,再遞歸到2與2自己對換,后來打印出312.

寫得比較抽象,但只能這樣了。只可意會,不可言傳~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM