全排列
全排列指1~n个整数按照某个顺序得出的结果就是一个排列,而全排列则是所有可能的顺序排列出来得到的结果.例如,对1 2 3这 三个数字可以得出的排列有123,132,213,231,312,321这六种.字典序就不解释了吧,我这个排序就是字典序,简单说就是从小到大.
递归实现全排列
实现全排列有好几种方法,今天下午看了哈希表和递归,就先写一下用递归的方式实现的代码吧.
#include<cstdio>
const int maxn = 11;
int n, p[maxn], hashTable[maxn] = { false };
int m = 0, o=0;
void generateP(int index){
if (index == n + 1){
for (int i = 1; i <= n; i++){
printf("%d",p[i]);
}
printf("\n");
return;
}
for (int x = 1; x <= n; x++){
m++;
if (hashTable[x] == false){
p[index] = x;
hashTable[x] = true;
generateP(index + 1);
hashTable[x] = false;
o++;
}
}
}
int main(){
n = 3;
generateP(1);
printf("%d\n%d",m,o);
return 0;
}
// 用数组实现全排列
public static void main(String[] args) {
int a[] = {1,2,3};
dfs(a,0);
}
private static void dfs(int a[],int n){
int len = a.length;
if(n>=len - 1){
//n定位到最后一个数,到递归出口
for (int i : a) {
System.out.print(i);
}
System.out.println();
}else{
for (int i = n; i < len; i++) {
{int temp = a[n];a[n] = a[i];a[i] = temp;}
dfs(a,n+1);
{int temp = a[n];a[n] = a[i];a[i] = temp;}
}
}
}