public class T02test {
/**
* java全排雷
* 以1,2,3为例 prime(1,2,3) = [1+prime(2,3)]+[2+prime(1,3)]+[3+prime(1,2)]
* 现在定义两个变量 left,right
* 其算法思想是把left和right两个下标的元素对换,然后left+prime(left+1,length),其中length代表数组长度
* 是使用递归的形式展开的
*/
@Test
public void test(){
//先定义要进行全排列的数组
int[] arr = {1, 2, 3};
//求出数组的长度
int length = arr.length;
prime(arr,0,length);
}
/**
* 全排列算法
* @param arr
* @param left
* @param right
*/
private void prime(int arr[],int left,int right){
//递归的约束条件
//当left == right - 1时,代表已经剩下一个元素进行要进行全牌列了
if (left == right-1){
//打印数组中的元素
System.out.println(Arrays.toString(arr));
//打印完成后,直接结束方法的调用,否则会进行一场无意义的排列
return;
}
//下标left依次和下标i的元素进行位置对换,直到i = length -1
for (int i = left; i < right ; i++) {
//开始交换位置 prime(1,2,3) = [1+prime(2,3)]+[2+prime(1,3)]+[3+prime(1,2)]
swap(arr,left,i);
//交换位置后,对剩下的元素再次进行全排列
prime(arr,left+1,right);
//把第一步交换位置的元素给恢复过来
swap(arr,i,left);
}
}
/**
* 交换两个位置
* @param arr
* @param left
* @param right
*/
private void swap(int arr[],int left,int right){
int temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
}
}
全排列算法-java
最新推荐文章于 2023-06-21 21:17:18 发布