全排列算法实现原创
# 全排列算法实现
# 问题
得到a,b,c,d的所有排列顺序。
# 思想
分治法:依次固定第一位的字母,剩下的位再做全排列。
例如,
// Q(a,b,c,d)表示a,b,c,d的全排列
Q(a,b,c,d) = {
1=a,+Q(b,c,d), // 第一位是a,剩下bcd做全排列
1=b,+Q(a,c,d), // ab交换,使b做第一位
1=c,+Q(b,a,d), // ac交换,使c做第一位
1=d,+Q(b,c,a), // ad交换,使d做第一位
}
1
2
3
4
5
6
7
2
3
4
5
6
7
这样4字母的全排列就被分解成了多个3字母全排列,如此继续递归,最终一个字母的全排列就是它本身,递归结束。
# 代码
#include<iostream>
using namespace std;
//交换
void swap (char &a, char &b) {
char temp;
temp = a;
a = b;
b = temp;
}
//全排列递归算法
void permutation (char list[], int first ,int size) {
if (first == size - 1) {
for (int i = 0 ;i < size; i++) {
cout << list[i];
}
cout << endl;
} else {
for (int i = first; i < size; i++) {
swap(list[i],list[first]);
permutation(list, first + 1, size);
swap(list[i], list[first]);
}
}
}
int main (void) {
char list[] = {'a', 'b', 'c', 'd'};
int first = 0;
int size = 4;
permutation(list, first, size);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 结果
abcd
abdc
acbd
acdb
adcb
adbc
bacd
badc
bcad
bcda
bdca
bdac
cbad
cbda
cabd
cadb
cdab
cdba
dbca
dbac
dcba
dcab
dacb
dabc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
编辑 (opens new window)
上次更新: 2022/10/03, 09:24:26
- 01
- Linux系统移植(五)--- 制作、烧录镜像并启动Linux02-05
- 03
- Linux系统移植(三)--- Linux kernel移植02-05