输出数组所有全排列

之前说了输出组合,那么这次说说输出全排列。经过自己的思考,也看了看其他人的全排列算法,我还是决定将我的思路说出来。

此次算法经过递归来实现。

1.比如一组,char[]c={'a','b','c'};那么先单个扫描得a,b,c。再在a,b,c加入剩下的元素,为{ab,ac},{ba,bc},{ca,cb},再加入剩下的元素{abc,acb},{bac,bca},{cab,cba}..

此次为java实现:

public void sortAll(List<Character> l,List<Character> r) {
	for(int i=0;i<l.size();i++){
		List<Character> newL=new ArrayList<Character>(l);//预备元素
		List<Character> newR=new ArrayList<Character>(r);//显示结果
		newR.add(newL.remove(i));//元素加入
		System.out.println(newR.toString().replaceAll("(\\[|\\]|,| )", ""));//结果输出,后面是正则表达式,用于去除{},和空格
		sortAll(newL,newR);//进层
	}
}
List<Character> l=new ArrayList<Character>();
char []a=new char[]{'a','b','c'};
for(int i=0;i<a.length;i++){
	l.add(a[i]);
}
sortAll(l,new ArrayList<Character>());


希望大家共同进步。

以下是几种不同语言实现数组全排列的函数: ### JavaScript 实现 #### 方法一 ```javascript var arr = [1, 2, 3]; // swap用来交换数组a中的两个元素 function swap(arr, p, q) { [arr[p], arr[q]] = [arr[q], arr[p]]; } // 全排列函数pai,在数组arr中,对p位置到q位置之间的元素进行全排列 function pai(arr, p, q) { if (p == q) { console.log(arr); // 一个数的全排列就是自己,输出自己 } else { for (let i = p; i < q; i++) { swap(arr, i, p); // 把 arr 中的每个元素都作一次头元素 pai(arr, p + 1, q); // 对头元素后的数据再次递归实现全排列 swap(arr, i, p); // 排完之后要换回来,防止重复排列 } } } pai(arr, 0, arr.length); ``` 此代码通过递归和交换元素的方式,将数组的每个元素依次作为头元素,对剩余元素进行全排列,最后恢复元素位置以避免重复排列[^1]。 #### 方法二 ```javascript function fullpermutate(args) { let result = []; let len = args.length; if (len > 1) { // 遍历每一项 for (let i = 0; i < len; i++) { // 拿到当前的元素 let left = args[i]; // 除了当前元素的其他元素组合(分为字符串和数组两种不同情况) let rest = null; if (typeof args == 'string') { rest = args.slice(0, i) + args.slice(i + 1, len); } else { rest = args.filter(item => item != args[i]); } // 上一次递归返回的全排列 let preResult = fullpermutate(rest); let preLen = preResult.length; // 组合在一起 for (let j = 0; j < preLen; j++) { let temp = null; if (typeof args == 'string') { temp = left + preResult[j]; result.push(temp); } else { temp = [left].concat(preResult[j]); result.push(temp); } } } } else if (len == 1) { result.push(args); } return result; } ``` 该函数通过递归的方式,遍历数组的每个元素,将其与剩余元素全排列组合起来,最终得到整个数组全排列[^2]。 #### 方法三 ```javascript var permArr = [], usedChars = []; function permute(input) { var i, ch; for (i = 0; i < input.length; i++) { ch = input.splice(i, 1)[0]; usedChars.push(ch); if (input.length == 0) { permArr.push(usedChars.slice()); } permute(input); input.splice(i, 0, ch); usedChars.pop(); } return permArr; } console.log(permute([5, 3, 7, 1])); ``` 此代码使用了递归和回溯的思想,通过不断地取出元素和恢复元素,生成数组全排列[^5]。 ### C++ 实现 #### 方法一 ```cpp #include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { int a[3] = {2, 3, 1}; sort(a, a + 3); do { for (int i = 0; i < 3; i++) cout << a[i] << " "; cout << endl; } while (next_permutation(a, a + 3)); } ``` 该代码使用了`next_permutation`函数,它会生成数组的下一个字典序排列,通过循环不断调用该函数,输出数组全排列,且不会产生重复的排列[^3]。 #### 方法二 ```cpp #include <iostream> using namespace std; int n = 0; template <class T> void Swap(T *a, T *b) { T temp = *a; *a = *b; *b = temp; } template <class T> void Perm(T A[], int k, int m) { if (k > m) { for (int i = 0; i <= m; i++) { cout << A[i] << " "; } n++; cout << endl; } else { for (int i = k; i <= m; i++) { Swap(&A[k], &A[i]); Perm(A, k + 1, m); Swap(&A[k], &A[i]); } } } int main() { char A[4] = {'a', 'b', 'c', 'd'}; Perm(A, 0, 3); cout << "Total number is: " << n << endl; return 0; } ``` 此代码通过递归和交换元素的方式,生成数组全排列,并统计排列的总数[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值