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

浙公网安备 33010602011771号