31. Next Permutation

    /*
     * 31. Next Permutation 
     * 2016-4-18 by Mingyang 
     * 这道题目开始自己想还不是很容易找到规律!!你比如说一个从后往前增加的序列就不需要next premutation,但是一旦遇到一个减少的数
     * 比如2,3,6,5,4,1
     * 1) 先从后往前找到第一个不是依次增长的数,记录下位置first。比如例子中的3,对应的位置是first; 2) 接下来分两种情况: 
     * (1)如果上面的数字都是依次增长的
     * ,那么说明这是最后一个排列,下一个就是第一个,其实把所有数字反转过来即可(比如(6,5,4,3,2,1)下一个是(1,2,3,4,5,6));
     * (2) 否则,如果first存在,从First开始往后找,找到第一个比他大的数,然后两个调换位置,比如例子中的4。
     * 调换位置后得到(2,4,6,5,3,1)。最后把p之后的所有数字倒序.2,4,1,3,5,6
     */
    // http://blog.csdn.net/linhuanmars/article/details/20434115
    public void nextPermutation(int[] num) {
        int n = num.length;
        if (n < 2)
            return;
        int index = n - 1;
        while (index > 0) {
            if (num[index - 1] < num[index])
                break;
            index--;
        }
        if (index == 0) {
            reverseSort(num, 0, n - 1);
            return;
        } else {
            int val = num[index - 1];
            int j = n - 1;
            while (j >= index) {
                if (num[j] > val)
                    break;
                j--;
            }
            swap(num, j, index - 1);
            reverseSort(num, index, n - 1);
            return;
        }
    }
    private void swap(int[] num, int i, int j) {
        int tmp = num[i];
        num[i] = num[j];
        num[j] = tmp;
    }
    private void reverseSort(int[] num, int i, int j) {
        while (i < j)
            swap(num, i++, j--);
    }
原文地址:https://www.cnblogs.com/zmyvszk/p/5406975.html