全排列JAVA实现

前言

参考资料
全排列:即所有的排列情况数,例如1,2,3的全排列包括:123,132,213,231,312,321这几种情况,可以通过编程实现。
思路:
fullSort方法接收三个参数,数组arr,起始位置start,终止为止end,意思就是完成arr数组从start到end之间记录的全排列。
分两个步骤:
(1)确定第一位的字符
数组arr从start到end的所有记录都可以出现在第一个位置,所以直接一个for循环,考虑了这所有的情况。在for循环中,swap方法就是交换i和start位置的数,保证当前i指向的记录出现在第一个位置,也就是start指向的位置
(2)剩下的记录继续做全排列
这个就是一个递归函数的调用,只需要修改起始位置,也就是start+1,因为start的位置已经放了记录,所以只需要继续做从start+1到end的全排列即可

通过回溯法就可以解决问题,但是对于回溯法来说需要注意:1.递归的终止条件;2.本层需要进行的操作;3.下一层需要进行的操作;4.上面调用值返回之后本层需要做的恢复工作即回溯;

1.当可选择的值为1个时,即START==END时停止,这个时候数组中元素的顺序就是一种情况;
2.本层首先需要将要放在本位置的字符给交换到最前面,这样保证后面的元素都是没有使用过的元素;
3.往下一层递归,可选择的值减少一个,即START+1;
4.将上面的操作恢复,进行回溯;

public class Main {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4 };
        fullSort(arr, 0, arr.length - 1);
    }

    public static void fullSort(int[] arr, int start, int end) {
        // 递归终止条件
        if (start == end) {
            for (int i : arr) {
                System.out.print(i);
            }
            System.out.println();
            return;
        }
        for (int i = start; i <= end; i++) {
            swap(arr, i, start);
            fullSort(arr, start + 1, end);
            swap(arr, i, start);
        }
    }

    private static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

}

你可能感兴趣的:(数据结构与算法)