在算法基础中,有两种关于排列的算法经常使用到,一种是<1>全排列问题(有序),一种是<2>子集问题(无序)。接下来我们使用数据集进行案例演示:
in the algorithm foundation.there are tow kinds of algorithm are often used.one named full permutation problem,and another one named subSet problem.let us show it through a demostrate.
<1>数据:
elemnt:[1,2,3]
result:
1 2 3
1 3 2
2 1 3
2 3 1
3 2 1
3 1 2
<2>数据:
elemnt:[1,2,3]
result:
1 2 3
1 2
1 3
1
2 3
2
3
如何实现需求<1> <2>的需求?
<1>.1-----邻位交换法
<1>.1-----Ortho transposition algorithm
//程序大意:
//通过递归交换内部元素进行全排列的生成
package Algorithm;
//这是配列问题的第一种解法
//也成为邻位对换算法
public class ArrangementProblemsA1 {
public static void main(String[] args) {
int[] list = {1,2,3};
Perm(list,0,list.length);
}
public static void Perm(int[] list, int k, int m) {
//只剩下最后一个元素不需要置换
if (k == m) {
for(int index = 0;index<list.length;index++){
System.out.print(list[index]+" ");
}
System.out.println();
}
else{
for(int index = k;index<m;index++){
//将list[k]作为首部
Swap(list,index,k);
//将list[k+1:m]作为递归条件
Perm(list,k+1,m);
//复位
Swap(list,index,k);
}
}
}
public static void Swap(int[] list,int i,int j){
int temp = list[i];
list[i] = list[j];
list[j] = temp;
}
}
<1>.2-----label algorithm
<1>.2-----标签法
//程序大意:
//通过判断是否fang'wen
package Algorithm;
//这是配列问题的第二种解法
public class ArrangementProblemsA2 {
static int n = 10;
//设置结果数组
static int[] result = new int[n];
//设置标志位
//默认为false
static boolean[] hashTable = new boolean[n];
static int[] list = {1, 2, 3, 4, 5};
public static void main(String[] args) {
//从index = 0开始全排列
Perm(0);
}
public static void Perm(int index) {
//如果排到最后一位的时候则可以直接打印数据
if (index == 2) {
for (int i = 0; i < list.length; i++) {
System.out.print(result[i] + " ");
}
System.out.println();
} else {
for (int x = 0; x < list.length; x++) {
//System.out.println(">>>>>>>>>>>>>>>>>"+index+" "+list.length);
//若当前标志位还在则进行置换
if (hashTable[x] == false) {
result[index] = list[x];
hashTable[x] = true;
Perm(index+1);
//还原标志位
hashTable[x] = false;
}
}
}
}
}
<2>-----selective splicing algorithm
<2>-----选择拼接法
package Algorithm.Recursion;
import java.util.ArrayList;
/**
* @author 韦海涛
* @version 1.0
* @date 4/17/2021 2:08 AM
*/
public class ArrangementProblemsC {
//用于存放求取子集中的元素
public static ArrayList<Integer> list = new ArrayList<Integer>();
public static void getSubSet(int[] A, int step,int len) {
while (step != A.length) {
//递归执行语句,向数组链表中添加一个元素
list.add(A[step]);
step++;
getSubSet(A, step,len);
//回溯执行语句,删除数组链表最后一个元素
list.remove(list.size() - 1);
}
for(int i = 0;i < list.size();i++) {
System.out.print(list.get(i)+" ");
}
System.out.println();
}
public static void main(String[] args) {
int [] arr = {1,2,3};
getSubSet(arr,0,3);
}
}