下一个排列

45 阅读1分钟
// 下一个排列  
// 下一个总比前一个大一点  
// [1,2,3]  
// [1,3,2]  
// [2,1,3]  
// [2,3,1]  
// [3,1,2]  
// [3,2,1]  
  
public static void nextPermutation(int[] nums){  
    int i=nums.length-2;  
    // 从后往前查找第一个i<i+1的数 2,非倒序的数  

    while (i>=0&&nums[i]>=nums[i+1]){  
        i--;  
    }  
    if(i>=0){  
        int j=nums.length-1;  
        // 在从右边找一个大于他的数交换  
        while (j>=0&&nums[i]>=nums[j]){  
            j--;  
        }  
        swap(nums,i,j);  
    }  
    // 在反转右边部分  
    reverse(nums,i+1);  
}  
  
//交换  
private static void swap(int[] nums, int i, int j) {  
    int temp=nums[i];  
    nums[i]=nums[j];  
    nums[j]=temp;  
}  
//反转  
private static void reverse(int[] nums,int start){  
    int left=start,right=nums.length-1;  
    while (left<right){  
        swap(nums,left,right);  
        left++;  
        right--;  
    }  
}