import java.util.Scanner;
public class Test4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
Test4 a = new Test4();
Scanner input = new Scanner(System.in);
System.out.print("请输入要排列的元素有多少种:");
int count = input.nextInt();
int[] p = new int[count];
for (int i = 1; i <= p.length; i++) {
p[i-1] = i;
}
boolean con;
do {
a.pr(p);//输出排列p
con = a.next(p);//求出按字典序排列的下一个排列p
} while (con);
}
public int indexof(int[] n) {
int index = -1;
for (int i = n.length - 1; i >= 1; i--) {
if (n[i-1] < n[i]) {
index = i - 1;
break;
}
}
return index;
}
public int indexmin(int ini, int[] n) {
int index = n.length - 1;
int min = n[ini + 1];
for (int i = ini + 1; i < n.length; i++) {
if (n[i] <= min && n[i] > n[ini]) {
min = n[ i ];
index = i;
}
}
return index;
}
public void swap(int index1, int index2, int[] n) {
int temp;
temp = n[index1];
n[index1] = n[index2];
n[index2] = temp;
}
public void oppositeDirection(int index1, int[] n) {
for (int i = index1 + 1, j = n.length - 1, k = 0, temp; k <= (n.length - i) / 2; i++, j--, k++) {
temp = n[i];
n[i] = n[j];
n[j] = temp;
}
}
public boolean next(int[] n) {
int index1 = indexof(n);
if (index1 == -1) {
return false;
}
int index2 = indexmin(index1, n);
swap(index1, index2, n);
oppositeDirection(index1, n);
return true;
}
public void pr(int[] n) {
for (int i = 0; i < n.length; i++) {
System.out.print(n[i] + " ");
}
System.out.println();
}
}
字典序法
最新推荐文章于 2022-07-26 22:41:02 发布