【算法】求{1,2,3}序列的全排列,邻里交换法(Java)
代码如下:
javapublic class Main{ static int count; static int a[]= {1,2,3}; public static void main(String[] args) { f(a,0); System.out.println(count); } public static void f(int a[],int step) { if(step==a.length-1) { count++; return; } for(int i=step;i<a.length;i++) { { int x=a[i];//交换 a[i]=a[step]; a[step]=x; } f(a,step+1); { int x=a[i];//还原数据 a[i]=a[step]; a[step]=x; } } } }
图解如下:
**执行过程如下:**这段代码实现了对数组
a
中元素的全排列,并在count
中记录排列的数量。下面是每一步的具体细节:
初始状态:
a[] = {1, 2, 3}
count = 0
调用
f(a, 0)
,进入函数f
:
a[] = {1, 2, 3}
step = 0
进入
for
循环,i = 0
:
- 交换
a[0]
和a[0]
(实际上没有变化)- 进入递归,调用
f(a, 1)
:
a[] = {1, 2, 3}
step = 1
进入
for
循环,i = 1
:
- 交换
a[1]
和a[1]
(实际上没有变化)- 进入递归,调用
f(a, 2)
:
a[] = {1, 2, 3}
step = 2
step == a.length - 1
成立,执行count++
:
count = 1
返回上一层递归,恢复数组
a
到初始状态:
a[] = {1, 2, 3}
继续
for
循环,i = 2
:
- 交换
a[2]
和a[1]
,得到a[] = {1, 3, 2}
- 进入递归,调用
f(a, 2)
:
a[] = {1, 3, 2}
step = 2
step == a.length - 1
成立,执行count++
:
count = 2
返回上一层递归,恢复数组
a
到初始状态:
a[] = {1, 2, 3}
返回上一层递归,恢复数组
a
到初始状态:
a[] = {1, 2, 3}
继续
for
循环,i = 1
:
- 交换
a[1]
和a[0]
,得到a[] = {2, 1, 3}
- 进入递归,调用
f(a, 1)
:
a[] = {2, 1, 3}
step = 1
进入
for
循环,i = 1
:
- 交换
a[1]
和a[1]
(实际上没有变化)- 进入递归,调用
f(a, 2)
:
a[] = {2, 1, 3}
step = 2
step == a.length - 1
成立,执行count++
:
count = 3
返回上一层递归,恢复数组
a
到初始状态:
a[] = {2, 1, 3}
继续
for
循环,i = 2
:
- 交换
a[2]
和a[1]
,得到a[] = {2, 3, 1}
- 进入递归,调用
f(a, 2)
:
a[] = {2, 3, 1}
step = 2
step == a.length - 1
成立,执行count++
:
count = 4
返回上一层递归,恢复数组
a
到初始状态:
a[] = {2, 1, 3}
返回上一层递归,恢复数组
a
到初始状态:
a[] = {1, 2, 3}
继续
for
循环,i = 2
:
- 交换
a[2]
和a[0]
,得到a[] = {3, 2, 1}
- 进入递归,调用
f(a, 1)
:
a[] = {3, 2, 1}
step = 1
进入
for
循环,i = 1
:
- 交换
a[1]
和a[1]
(实际上没有变化)- 进入递归,调用
f(a, 2)
:
a[] = {3, 2, 1}
step = 2
step == a.length - 1
成立,执行count++
:
count = 5
返回上一层递归,恢复数组
a
到初始状态:
a[] = {3, 2, 1}
继续
for
循环,i = 2
:
- 交换
a[2]
和a[1]
(实际上没有变化)- 进入递归,调用
f(a, 2)
:
a[] = {3, 2, 1}
step = 2
step == a.length - 1
成立,执行count++
:
count = 6
返回上一层递归,恢复数组
a
到初始状态:
a[] = {3, 2, 1}
返回上一层递归,恢复数组
a
到初始状态:
a[] = {1, 2, 3}
返回上一层递归,主函数结束。
最终输出
count
的值为6
,表示数组[1, 2, 3]
【算法】求{1,2,3}序列的全排列,邻里交换法(Java)
小熊吖吖2024-04-19 14:14
相关推荐
喻米粒06228 分钟前
RabbitMQ消息相关陈皮话梅糖@1 小时前
使用 Provider 和 GetX 实现 Flutter 局部刷新的几个示例简简单单做算法1 小时前
基于mediapipe深度学习和限定半径最近邻分类树算法的人体摔倒检测系统python源码hvinsion2 小时前
基于PyQt5的自动化任务管理软件:高效、智能的任务调度与执行管理Tisfy2 小时前
LeetCode 2360.图中的最长环:一步一打卡(不撞南墙不回头) - 通过故事讲道理Aphelios3802 小时前
Java全栈面试宝典:线程机制与Spring IOC容器深度解析LuckyAnJo2 小时前
Leetcode-100 链表常见操作qq_529835353 小时前
装饰器模式:如何用Java打扮一个对象?日暮南城故里3 小时前
Java学习------源码解析之StringBuilderVitalia3 小时前
从零开始学Rust:枚举(enum)与模式匹配核心机制