iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java实现全排列的三种算法详解
  • 304
分享到

Java实现全排列的三种算法详解

2024-04-02 19:04:59 304人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录算法一算法二算法三算法一 基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然

算法一

基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然后再排列以2为第一位的情况,重复上述过程将所有可能结果全部放入res中。

代码:

import java.util.ArrayList;
import java.util.List;
 
public class h618_1 {
 
    static List<List<Integer>> res = new ArrayList<>();
    public static void main(String[] args) {
        int[] arr = {1,2,3};
 
        h618_1 h1 = new h618_1();
        h1.dfs(arr,new ArrayList<>());
        for (List<Integer> re : res) {
            System.out.println(re);
        }
 
    }
 
    public List<List<Integer>> dfs( int[] arr,List<Integer> list){
        List<Integer> temp = new ArrayList<>(list);
        if (arr.length == list.size()){
            res.add(temp);
        }
        for (int i=0;i<arr.length;i++){
            if (temp.contains(arr[i])){
                continue;
            }
            temp.add(arr[i]);
            dfs(arr,temp);
            temp.remove(temp.size()-1);
        }
        return res;
    }
 
}

算法二

通过交换位置实现全排列:假设集合为{1,2,3,4};

循环交换位置:1和1交换;1和2交换;1和3交换;1和4交换;

每一次交换再通过递归调用更小的集合:

如:第一次1和1交换确定了1在第一位 所以可以看成 {1} + 递归交换{2,3,4};

第一次1和2交换确定了2在第一位 所以可以看成 {2} + 递归交换{1,3,4};

第一次1和3交换确定了3在第一位 所以可以看成 {3} + 递归交换{1,2,4};

第一次1和4交换确定了4在第一位 所以可以看成 {4} + 递归交换{1,2,3};

依次类推。

代码:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
 
public class h618_2 {
    static List<List<Integer>> res = new ArrayList<>();
    public static void main(String[] args) {
 
        int[] arr = {1,2,3};
        h618_2 h2 = new h618_2();
        h2.pailie_swap(0,arr);
 
    }
    public void pailie_swap(int index, int[] arr){
        if (arr.length==index){
            System.out.println(Arrays.toString(arr));
            return;
        }
        for (int i = index;i<arr.length;i++){
            swap(i,index,arr);
            pailie_swap(index+1,arr);
            swap(i,index,arr);
        }
 
    }
 
    public void swap(int i,int j ,int[] arr){
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
 
    }
}

算法三

可以通过添加元素来实现全排列:

首先定义一个list 放入第一个元素为; 然后将剩余的元素依次插入之前的集合元素的所有可能的位置生成新的list;

例如:对{1,2,3,4}实现全排列

首先定义一个list 加入第一个元素为 {1}; 然后第二个元素2可以插入{1} 的前后两个位置形成新list :{21,12 },  第三个元素3分别插入list 的元素的所有位置 为:{321,231,213,312,132,123}; 以此类推。

代码:

import java.util.ArrayList;
 
public class h618_3 {
 
    public static void main(String[] args) {
        String aa = "123";
        h618_3 h3 = new h618_3();
        ArrayList<String> res = new ArrayList<>();
        res = h3.getPermutation0(aa);
 
        for (String re : res) {
            System.out.println(re);
        }
 
    }
 
    public ArrayList<String> getPermutation0(String A) {
        int n = A.length();
        ArrayList<String> res = new ArrayList<>();
        res.add(A.charAt(0) + "");//初始化,包含第一个字符
 
        for (int i = 1; i < n; i++) {//第二个字符插入到前面生成集合的每个元素里面
            ArrayList<String> res_new = new ArrayList<>();
            char c = A.charAt(i);//新字符
            for (String str : res) {//访问上一趟集合中的每个字符串
                //  插入到每个位置,形成一个新串
                String newStr = c + str;//加在前面
                res_new.add(newStr);
                newStr = str + c;//加在后面
                res_new.add(newStr);
                //加在中间
                for (int j = 1; j < str.length(); j++) {
                    newStr = str.substring(0, j) + c + str.substring(j);
                    res_new.add(newStr);
                }
            }
            res = res_new;//更新
 
        }
        return res;
    }
}

到此这篇关于Java实现全排列的三种算法详解的文章就介绍到这了,更多相关Java全排列内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java实现全排列的三种算法详解

本文链接: https://www.lsjlt.com/news/152062.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java实现全排列的三种算法详解
    目录算法一算法二算法三算法一 基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现没有其他可能的情况,再回溯到1,排列为1,3,2再向上回溯到存在其他情况时,即根节点然...
    99+
    2024-04-02
  • Java实现全排列的三种算法是什么
    Java实现全排列的三种算法分别是:1. 回溯法:回溯法是通过递归实现的,它通过不断交换数组中的元素位置来生成全排列。具体步骤是,从...
    99+
    2023-08-11
    Java
  • Java算法如何实现全排列
    本篇内容主要讲解“Java算法如何实现全排列”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java算法如何实现全排列”吧!算法一基于递归与回溯实现。在排列1,2,3的时候,先由3向上回溯到2发现...
    99+
    2023-07-02
  • java全排列算法怎么实现
    以下是一种实现Java全排列算法的方法:```javaimport java.util.ArrayList;import java....
    99+
    2023-09-26
    java
  • Java实现常用的三种加密算法详解
    目录前言密钥密钥分类密钥和密码密钥管理密钥生成信息摘要算法MD系列SHA系列对称加密算法DES3DESAES非对称加密算法前言 编程中常见的加密算法有以下几种,它们在不同场景中分别有...
    99+
    2024-04-02
  • java实现排列组合算法
    我这里只写了组合的算法。         假设现有 M=4 个数据 a,b,c,d。从中随机抽取n个数,n为1—4个数据进行组合。那么数学中的计算组合方式为C(4,1) + C(4,2) + C(4,3) + C(4,4)  = 4 + 6...
    99+
    2023-09-01
    排列组合 数据结构 java
  • 详细总结各种排序算法(Java实现)
    一、插入类排序1.直接插入排序思想:将第i个插入到前i-1个中的适当位置时间复杂度:T(n) = O(n²)。空间复杂度:S(n) = O(1)。稳定性:稳定排序。如果碰见一个和插入元素相等的,那么插入元素把想插入的元素放在相等元...
    99+
    2023-05-31
    java 排序算法 ava
  • 详解Java实现拓扑排序算法
    目录一、介绍二、拓扑排序算法分析三、拓扑排序代码实现一、介绍 百科上这么定义的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中...
    99+
    2024-04-02
  • 利用Java如何实现全排列算法和递归
    利用Java如何实现全排列算法和递归?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。全排列:从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从...
    99+
    2023-05-31
    全排列 递归 ava
  • Java中List排序的三种实现方法实例
    目录前言1.使用 Comparable 排序2.使用 Comparator 排序2.1 新建 Comparator 比较器2.2 匿名类比较器3.使用 Stream 流排序总结前言 ...
    99+
    2024-04-02
  • JS实现数组随机排序的三种方法详解
    目录1.利用数组方法sort实现随机排序2.洗牌算法实现随机排序3.洗牌算法深入分析全部代码1.利用数组方法sort实现随机排序 实现随机排序方法还是很多的,用for循环是可以写的,...
    99+
    2024-04-02
  • c++全排列的递归算法怎么实现
    下面是C++中全排列的递归算法的实现:```cpp#include #include using namespace std;// ...
    99+
    2023-09-28
    c++
  • java如何实现排列组合算法
    这篇文章主要介绍java如何实现排列组合算法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!java排列组合算法[@more@]import java.util.ArrayList;import j...
    99+
    2023-06-03
  • c语言全排列算法怎么实现
    以下是一个用C语言实现全排列的算法示例: #include <stdio.h> #include <string....
    99+
    2024-04-02
  • python如何实现常用的五种排序算法详解
    目录一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、快速排序 总结一、冒泡排序 原理: 比较相邻的元素。如果第一个比第二个大就交换他们两个 每一对相邻...
    99+
    2024-04-02
  • Java 归并排序算法、堆排序算法实例详解
    基本思想:  归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序示例:合并方法:设r[i…n]由两个有序子表r[i…m...
    99+
    2023-05-31
    java 归并排序 堆排序
  • 详解C语言快速排序三种方法的单趟实现
    目录交换排序的思想冒泡排序的思想快速排序的整体框架快速排序单趟实现逻辑1. hoare版本单趟实现(左右指针法)2.挖坑法单趟排序实现3.前后指针法交换排序的思想 基本思想:所谓交换...
    99+
    2024-04-02
  • 如何用Java实现排列组合算法
    目录需求从排列到组合-穷举从排列到组合-分治分治思想代码实现直击本质-位运算思想代码实现小结需求 我们的数据表有多个维度,任意多个维度组合后进行 group by 可能会产生一些”奇...
    99+
    2024-04-02
  • Java中List排序的三种实现方法是怎样的
    Java中List排序的三种实现方法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言在某些特殊的场景下,我们需要在 Java 程序中对 List 集合...
    99+
    2023-06-22
  • 详解Java实现JSONArray转Map的三种实现方式
    目录 第一种第二种 第三种 本文只是自己常用的三种,自己总结一下,不是只有这三种,杠精走开; JSONArray数据 [ { "...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作