import java.util.Scanner;
public class LP{
//交换两个元素,传入元素数组和需要交换的两个元素的下标
public static int[] swap2(int[] num, int i, int j) {
int temp = num[i];
num[i] = num[j];
num[j] = temp;
return num;
}
//判断是否是降序(若是降序则代表字典序全排列过程结束)
public static boolean ifDescendOrder(int[] num) {
for(int i = 0; i < num.length - 1; i++)
if(num[i] < num[i + 1])
return true;
return false;
}
//反序指定下标到数组最后的元素
public static int[] reverseN(int[] num, int start) {
//反序部分的长度
int l = num.length - start;
//指定部分反序
for(int i = 0; i < l / 2; i++) {
int temp = num[start + i];
num[start + i] = num[l - i - 1 + start];
num[l - i - 1 + start] = temp;
}
return num;
}
//字典序全排列
public static void lexicographicPermute(int n) {
int[] nums = new int[n];
//k记录ai小于a(i+1)的最大的i
//m记录ai小于aj的最大索引j
int k = 0, m = 0;
//初始化数组
for(int i = 0; i < n; i++)
nums[i] = i + 1;
//输出第一个顺序的排列
for(int i = 0; i < n; i++)
System.out.print(nums[i]);
System.out.println();
//当数组元素完全逆序则代表排列结束
while(ifDescendOrder(nums)) {
//找到ai小于a(i+1)的最大的i,用k记录
for(int i = 0; i < nums.length - 1; i++)
if(nums[i] < nums[i + 1])
k = i;
//找到ai小于aj的最大索引j,用m记录
for(int i = k + 1; i < nums.length; i++)
if(nums[i] > nums[k])
m = i;
//交换ai和aj即交换ak和am
nums = swap2(nums, k, m);
//将a(i+1)即a(k+1)到an的元素反序
nums = reverseN(nums, k + 1);
//输出当前的一个排列
for(int i = 0; i < nums.length; i++)
System.out.print(nums[i]);
System.out.println();
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
//调用算法
lexicographicPermute(n);
in.close();
}
}
网友评论