next_permutation()/prev_permutaton()的實現(Java版)
阿新 • • 發佈:2018-12-17
Java裡也沒有這個東西…
public class Main{
/**
* 下一個排列 stl中的next_permutation()
* @param nums
* @return
*/
static boolean nextPermutation(int[] nums){
//將陣列分為三部分,第二部分是一個元素,第三部分是遞減子序列
int len=nums.length;
for(int i=len-1;i>0;i--){
//找到第二第三部分的分界線
if (nums[i]>nums[i-1]){
//v即為第二部分元素
int v=nums[i-1];
int j=len-1;
//在第三部分元素找到最小的大於第二部分元素的元素
for(;j>=i;j--){
if(nums[j]>v){
break;
}
}
//進行交換
swap(nums,i-1,j);
int l=i;
int r=len-1;
//將第三部分元素逆序
while(l<r){
swap(nums,l,r);
l++;
r--;
}
//得到新的全排列
return true ;
}
}
//整個陣列已經遞減,沒有下一個排列
return false;
}
/**
* 上一個排列 stl中的prev_permutation()
* @param nums
* @return
*/
static boolean prevPermutation(int[] nums){
int len=nums.length;
for(int i=len-1;i>0;i--){
if(nums[i]<nums[i-1]){
int v=nums[i-1];
int j=len-1;
for(;j>=i;j--){
if(nums[j]<v){
break;
}
}
swap(nums,i-1,j);
int l=i;
int r=len-1;
while(l<r){
swap(nums,l,r);
l++;
r--;
}
return true;
}
}
return false;
}
static void swap(int[] nums,int i,int j){
int t=nums[i];
nums[i]=nums[j];
nums[j]=t;
}
static void printArr(int[] nums){
int l=nums.length;
for(int i=0;i<l;i++){
System.out.print(nums[i]+" ");
}
System.out.println();
}
public static void main(String[] args) {
int[] a=new int[]{1,2,3,4};
do{
printArr(a);
}while (nextPermutation(a));
System.out.println("-----------");
do{
printArr(a);
}while (prevPermutation(a));
}
}