java解决全排序问题

本文探讨了一种递归实现的全排序算法,相较于传统循环方法,它的时间复杂度降低至O(n^2),并通过代码示例详细讲解了递归过程。作者介绍了如何通过HashSet去重,以及`holder`和`wrap`方法的运用来简化排序过程。
摘要由CSDN通过智能技术生成
  1. 说明:
    • 这里的用例是数字数组。
    • 全排序样式如; 数组[ 1,1,3]
      他的全排序为:[1,1,3] , [1,3,1] ,[3,1,1]
  2. 对于全排序最简单的做法就是通过循环迭代去实现,思想是:

将所有的不同下标的数字都视为不一样的个体。然后用循环,每一个作为一次第一个元素,然后去排序其他的个体。在最里面的循环体中编成一个新的数组,并加入我们的设置的全局变量二维数组中存储起来,最后去重皆可。

如果我们数组长为n,那么需要最大的时间为; n的n次方,最小为 n!
很显然这样做需要使用到大量的嵌套循环去实现,代码量大,而且耗时长。

  1. 这里介绍一种递归的方法
    他计算使用到的时间为:n的平方
	public List<List<Integer>> sort(int[] num){
		//这里实例化一个二维数组存储最终数据,将temp添加进来
		List<List<Integer>> res = new ArrayList<>();
		//这里实例化一个一维数组保存排序好的num
		List<Integer> temp = new ArrayList<>();
		
		helder(num,res, temp, 0);
		return res;
	}
	public void helder(int[] num,List<List<Integer>> res,List<Integer> temp,int index) {
		//如果index>=num.lenght的时候就将temp加入到二维列表中
		if(index >= num.length) {
			res.add(temp);
		}
		//HashSet实现了Set接口,add一个元素时,先获取元素的哈希值,达到去重的效果
		Set<Integer> set = new HashSet<Integer>();
		for(int i = index; i < num.length; i++) {
			//如果set已经包含了num[i]那么就之间跳过
			if(set.contains(num[i])) {
				continue;
			}
			//如果不重复那么更新temp的值和set的值
			set.add(num[i]);
			temp.add(num[i]);
			//添加完毕之后我们给num的第i个和第index个数据交换位置,更新num
			wrap(num, index, i);
			helder(num, res, temp, index+1);
			//做完一次排序将temp的第index个数字移除进行下一个排序
			temp.remove(index);
			wrap(num, index, i);
			
		}
	}
	public void wrap(int[] num,int i ,int j) {
		int x = num[i];
		num[i] = num[j];
		num[j] = x;
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liaoMITC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值