全排列的实现字典序写法,递归也给附带写了

来源:互联网 发布:淘宝猫胡子是假货吗 编辑:程序博客网 时间:2024/06/05 01:54
1、字典序的实现
import java.util.Arrays;public class Main {public static void Permutation(int[] nums) {Arrays.sort(nums);while (true) {for (int i = 0; i < nums.length; i++) {System.out.print(nums[i]);}System.out.println();int p = 0;int q = 0;//找到第一个非递增的for (int i = nums.length - 2; i >= 0; i--) {if (nums[i] < nums[i + 1]) {p = i;break;}if (i == 0) {return;}}//从nums[p+1]到nums[nums.length - 1]找到第一个比nums[p]大的for (int j = nums.length - 1; j > p; j--) {if (nums[j] > nums[p]) {q = j;break;}}//交换nums[p]和nums[q]Swap(nums, p, q);//对nums[p+1]到nums[nums.length - 1]做翻转Reverse(nums, p + 1, nums.length - 1);}}public static void  Swap(int[] nums, int i, int j) {nums[i] = nums[i] + nums[j];nums[j] = nums[i] - nums[j];nums[i] = nums[i] - nums[j];}public static void Reverse(int[] nums, int l, int r) {while (l < r) {Swap(nums, l, r);l++;r--;}}public static void main(String[] args) {int[] a = {1, 3, 2};Permutation(a);}}

2、递归的实现

public class Main {public static void Permutation(int[] nums, int l, int r) {if (l == r) {for (int i = 0; i <= r; i++)System.out.print(nums[i]);System.out.println();return;}for (int i = l; i <= r; i++) {Swap(nums, l, i);Permutation(nums, l + 1, r);Swap(nums, l, i);}}public static void Swap(int[] nums, int i, int j) {int temp;temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public static void main(String[] args) {int[] a = {1, 2, 3};Permutation(a, 0, 2);}}


原创粉丝点击