刷题过程中, 经常遇到全排列问题, 这里记录一下.
c++库文件函数
c++ <algorithm> 头文件中包含next_permutation(iteration __first, iteration __last)可以求下一个全排列, 返回bool类型值; prev_permutation(iteration __first, iteration __last)可以求上一个全排列, 返回bool类型值;
具体见代码:
/*
* author: hejinyang
* date: 2020/2/5
* time: 13:24
* software: clion
*/
#include <algorithm>
#include <iostream>
#include <functional>
using namespace std;
int main() {
int a[] = {1, 2, 3};
do {
printf("%d %d %d\n", a[0], a[1], a[2]);
} while (next_permutation(a, a + 3));
sort(a, a + 3, greater<int>()); // 从大到小排序 // 3 2 1
printf("-------------------------------\n");
do {
printf("%d %d %d\n", a[0], a[1], a[2]);
} while (prev_permutation(a, a + 3));
return 0;
}
}
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
-------------------------------
3 2 1
3 1 2
2 3 1
2 1 3
1 3 2
1 2 3
利用递归实现
以3位的全排列为例进行实现(字典序)
#include <iostream>
using namespace std;
char data[] = {'a', 'b', 'c'};
const int length = sizeof(data) / sizeof(char);
char p_lst[length];
bool hashTable[length] = {false};
void print(char *d) {
for (int i = 0; i < length; ++i) {
printf("%c ", d[i]);
}
printf("\n");
}
void generatePerm(int index) {
if (index == length) {
print(p_lst);
return;
}
for (int i = 0; i < length; ++i) {
if (!hashTable[i]) {
p_lst[index] = data[i];
hashTable[i] = true;
generatePerm(index + 1);
hashTable[i] = false;
}
}
}
int main() {
generatePerm(0);
return 0;
}
H:\CPP_pro\pro01\a.exe
a b c
a c b
b a c
b c a
c a b
c b a
Process finished with exit code 0