问题:字典序用于求出一个数列的全排列,比如123,132,213,231,312,321,大小刚刚是按着字典序大小。
算法:
1.从后先前找出一个前小后大的a[i-1]<a[i]
2.从后到i早到第一个大于a[i-1]的记为a[j],交换a[j]和a[i-1]
3.从i到最后的数逆置
注:写法是模仿c++对字典序的使用格式写的
1 import java.util.Scanner;
2
3 public class Main{
4
5 public static void swap(int a[],int i,int j) {
6 int t=a[i];
7 a[i]=a[j];
8 a[j]=t;
9 }//交换
10
11 public static void inArray(int a[],int i,int j) {
12 int t;
13 while(i<j) {
14 t=a[i];
15 a[i++]=a[j];
16 a[j--]=t;
17 }
18 }//逆置
19
20 public static boolean next_permutation(int a[],int n) {
21 int i,j;
22 for(i=n-1;i>=1;i--) {
23 if(a[i-1]<a[i]) {
24 for(j=n-1;j>=i;j--)if(a[j]>a[i-1])break;
25 swap(a,i-1,j);
26 inArray(a,i,n-1);
27 break;
28 }
29 }
30 if(i>=1)return true;
31 return false;
32 }
33
34 public static void main(String arg[]) {
35 Scanner sc=new Scanner(System.in);
36 int[] a=new int[100];
37 int i,n;
38
39 n=sc.nextInt();
40 for(i=0;i<n;i++)a[i]=sc.nextInt();
41 do {
42 for(i=0;i<n;i++)System.out.print(a[i]);
43 System.out.println();
44 }while(next_permutation(a,n));//使用方法
45 }
46 }
stay hungry stay foolish