问题:字典序用于求出一个数列的全排列,比如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