字典序生成排列

import java.util.Scanner;

public class LP{
    
    //交换两个元素,传入元素数组和需要交换的两个元素的下标
    public static int[] swap2(int[] num, int i, int j) {
        int temp = num[i];
        num[i] = num[j];
        num[j] = temp;
        return num;
    }
    //判断是否是降序(若是降序则代表字典序全排列过程结束)
    public static boolean ifDescendOrder(int[] num) {
        for(int i = 0; i < num.length - 1; i++)
            if(num[i] < num[i + 1])
                return true;
        return false;
    }
    //反序指定下标到数组最后的元素
    public static int[] reverseN(int[] num, int start) {
        //反序部分的长度
        int l = num.length - start;
        //指定部分反序
        for(int i = 0; i < l / 2; i++) {
            int temp = num[start + i];
            num[start + i] = num[l - i - 1 + start];
            num[l - i - 1 + start] = temp;
        }
        return num;
    }
    //字典序全排列
    public static void lexicographicPermute(int n) {
        int[] nums = new int[n];
        //k记录ai小于a(i+1)的最大的i
        //m记录ai小于aj的最大索引j
        int k = 0, m = 0;
        
        //初始化数组
        for(int i = 0; i < n; i++)
            nums[i] = i + 1;
        //输出第一个顺序的排列
        for(int i = 0; i < n; i++)
            System.out.print(nums[i]);
        System.out.println();
        //当数组元素完全逆序则代表排列结束
        while(ifDescendOrder(nums)) {
            //找到ai小于a(i+1)的最大的i,用k记录
            for(int i = 0; i < nums.length - 1; i++)
                if(nums[i] < nums[i + 1])
                    k = i;
            //找到ai小于aj的最大索引j,用m记录
            for(int i = k + 1; i < nums.length; i++)
                if(nums[i] > nums[k])
                    m = i;
            //交换ai和aj即交换ak和am
            nums = swap2(nums, k, m);
            //将a(i+1)即a(k+1)到an的元素反序
            nums = reverseN(nums, k + 1);
            //输出当前的一个排列
            for(int i = 0; i < nums.length; i++)
                System.out.print(nums[i]);
            System.out.println();
        }
    }
    
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        //调用算法
        lexicographicPermute(n);
        in.close();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容