美文网首页
字典序生成排列

字典序生成排列

作者: Fgban | 来源:发表于2019-07-13 17:04 被阅读0次
    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();
        }
    }
    

    相关文章

      网友评论

          本文标题:字典序生成排列

          本文链接:https://www.haomeiwen.com/subject/ohemkctx.html