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--);
    }
相關文章
相關標籤/搜索