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);
}
}