数组所有排列的算法【基于盗梦空间】

前些日子遇到一个算法面试题,需要求出一个数组的所有排列方式,个人所运用到的迭代递归算法与电影的“梦中梦”神似,有感而发。
在每一次做梦之前,先预想好一个状态,在每一个梦做完之后,就需要恢复到我们做这一个梦之前的状态,因为在我们意识中的状态还是最初的状态,就像在递归之前改变数组的排列,递归完毕之后再恢复到这一次递归之前的状态。而我们并不知道我们的梦境处于第几层,于是我们需要一个标识来提供我们现在所处的位置。


//一个泛型数组的空杯交换
public static <T> void temp(T[] arr,int index1,int index2){
T temp;
temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
/**
* 迭代递归
* @param <T> 泛型
* @param arr 泛型数组
* @param flag 标识符,用以标识从第几个元素开始迭代递归,元素从0开始
*/
public static <T> void sortAll(T[] arr,int flag){
if(flag == arr.length){
System.out.println(Arrays.toString(arr));
}else{
for (int i = flag; i < arr.length; i++) {
temp(arr, i, flag);//迭代之前的空杯交换
sortAll(arr, flag+1);//递归,将当前的标记自增
temp(arr, i, flag);//迭代之后恢复原貌
}
}
}
//测试
public static void main(String[] args) {
// Integer[] arr = {1,2,2,3,4};
Object[] arr = {'a','b','c'};
sortAll(arr,0);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值