全排列算法-java

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;
    }
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值