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

字典序生成排列

作者: 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();
    }
}

相关文章

  • 字典序生成排列

  • 按照字典序生成全排列

    说到排列,肯定先想到生成排列,这一节讲如何按照字典序法生成数字的全排列或者某一排列的下一排列。 原理如上,给个题目...

  • 字典序排列

    字符串的全排列,普通递归如下: 详细的解析:http://blog.csdn.net/randyjiawenjie...

  • 生成组合对象之字典序生成排列

    伪代码 解析注意这里下标从1开始,0舍弃不用 举个例子 n=5时1. arr={14325} 下一个是143522...

  • Permutations

    求一个数组的全排列。 遇到的问题: 1.忘记了字典序排列的定义;2.思考时间过长;3.没有及时找到全排列和字典序之...

  • 枚举排列

    生成1-n的排列 具体题目为,输入整数n,按字典序大小从小到大顺序输出前n个数的所有排列。例如输入n=3,则要求得...

  • JavaScript#31:数组--(字典排序)Next Per

    求一个序列的下一个全排列...........按照字典序。 所谓字典序,比如说 123三个数字组成的全排列就有: ...

  • 下一个排列

    下一个排列 n个元素有n!种排列方式,你不会想都罗列出来再去找下一个排列吧 这种排序方式为字典序,字典序就是将元素...

  • 全排列(字典序和非字典序)

  • 字典序算法笔记

    一、相关概念介绍 字典序字典序就是按照字典中出现的顺序对字符进行排序。 全排列给定多个字符,可以按照任意顺序进行排...

网友评论

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

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