1. 程式人生 > >next_permutation()/prev_permutaton()的實現(Java版)

next_permutation()/prev_permutaton()的實現(Java版)

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)); } }