全排列

全排列

递归方法

public class Main {
    static void swap(int[] arr, int i, int j) {
        int t = arr[i];
        arr[i] = arr[j];
        arr[j] = t;
    }
    static void full(int[] arr, int start) {
        if (start == arr.length - 1) System.out.println(Arrays.toString(arr));
        else {
            // 将当前最左边和后面的值依次交换
            for (int i = start; i < arr.length; i++) {
                swap(arr, start, i);
                // 递归解决子数组全排列
                full(arr, start + 1);
                // 复原数组
                swap(arr, start, i);
            }
        }
    }
    public static void main(String[] args) throws Exception {
        full(new int[]{1,2,3,4}, 0);
    }
}

字典排序

public class Main {
    static void dict(int[] arr) {
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        while (true) {
            // 从最右起,找出为升序的相邻两个数,记录小的位置i
            int i;
            for (i = arr.length - 2; i >= 0; i--) {
                if (arr[i] < arr[i + 1]) break;
            }
            // 如果没有则表示完成字典排序
            if (i == -1) break;
            // 从最右起,找出比arr[i]大的第一个数,记录位置j
            int j;
            for (j = arr.length - 1; j > 0; j--) {
                if (arr[j] > arr[i]) break;
            }
            // 交换i和j
            int t = arr[i];
            arr[i] = arr[j];
            arr[j] = t;
            // 对i + 1到最后进行排序
            Arrays.sort(arr, i + 1, arr.length);
            System.out.println(Arrays.toString(arr));
        }
    }
    public static void main(String[] args) throws Exception {
        dict(new int[]{1, 1, 2, 4});
    }
}
Author: SinLapis
Link: http://sinlapis.github.io/2019/07/22/全排列/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.