java 实现next_permutation()

c++ STL中的next_permutation方法,求一下个字典序,
实现过程:

  1. 从后往前找第一个后一项大于前一项的数num[i]>num[i-1]
  2. 以i-1 为基准,从后往前找第一个大于num[i-1]的数,记做num[j],然后交换这两个数
  3. 将 i-1 后面的数全部翻转
  4. 参考博客: 参考1 、 参考2
import java.util.*;
public class Main {
     
	public static void reverse(int a,int b,int[] num) {
     
		while(a<b) {
     
			int t=num[a]; num[a]=num[b] ; num[b]=t ; 
			++a ; --b ; 
		}
	}
	public static boolean next_permutation(int a,int b,int[] num) {
     
		int i=b-1 ; 
		while(i>a&&num[i]<=num[i-1])	--i ;	//从后往前找第一个后一项大于前一项的 
		if (i==a)	return false ; 	//到头说明整个序列为逆序,没有下一个字典序了
		--i ;
		int j=b-1 ; 
		while(j>i&&num[j]<=num[i])	--j ; //从后往前找第一个大于num[i]的数
		int t=num[i]; num[i]=num[j]; num[j]=t ; //交换两个数
		reverse(i+1,b-1,num) ;	//i后面的数翻转
		return true ; 
	}
	public static void main(String[] args) {
     
		Scanner sc = new Scanner(System.in) ; 
		int[] num = {
     1,2,3,4} ; 
		do {
     
			for(int i=0 ; i<num.length ; ++i)	System.out.print(num[i]+" ");
			System.out.println();
		}while(next_permutation(0,num.length,num)) ; 
	
	}
	
}

你可能感兴趣的:(Java方法,STL函数)