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