算法札记之 全排列的 非递归求解
算法笔记之 全排列的 非递归求解
这个也是比较常见的方法。
先交换,再把后面的数组逆置就行了
递归的方法点下面:
算法笔记之 全排列算法 一 递归求解
private static void swap(int[] array, int i, int j) { int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } //排列. total 表示输出arr之后的 total个排列 static void permutation(int[] arr,int total) { // int total = 1; // for(int i=2; i<= size; i++){ // total *= i; // } // print_arr(arr); for(int i=1; i<total; i++){ int k = arr.length -1; //找到要进行替换的元素下标。 //即从后开始遍历,找到底一个非增的元素,和后面某个刚好大于它的元素替换 while( k>0 && arr[k] < arr[--k]); int min = Integer.MAX_VALUE; int minIndex = 0; //找到刚好比 替换到前面大的元素 for(int j=arr.length-1; j>= k+1; j--){ if(arr[j] > arr[k] && min > arr[j]){ min = arr[j]; minIndex = j; } } //与找到的元素 进行交换 swap(arr, k, minIndex); //做数组的 逆置 for(int m=0; m < (arr.length-k-1)/2; m++) swap(arr, k+1 + m, arr.length-1-m); print_arr(arr); } } public static void print_arr(int[] arr){ for(int i=0; i<arr.length; i++) System.out.print(arr[i]); System.out.println(); } public static void main(String[] args) { int arr[] = {1,2,3,4,5}; print_arr(arr); permutation(arr,23); }