简单全排列的逻辑(递归实现) 原创
全排列:
将一个包含了N个元素的数组进行所有可能组合的排列。
例如: 问题: 我们将集合a[]={1,2,3}进行排列,如何进行解决?
这里,我们可以运用分治的思路将问题转化为
以下三个新的问题:
- 1开头的全排列
- 2开头的全排列
- 3开头的全排列
我们利用DFS与回溯的概念,
当我们分到最后一个字符串数字的时候即可判断是否满足条件!
——以此得到下图的概念

即得到以下6个排列!
| 1,2,3 | 1,3,2 |
|---|---|
| 2,1,3 | 2,3,1 |
| 3,1,2 | 3,2,1 |
题目代码:
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {//交换函数
int t = a;
a = b;
b = t;
}
void perm(int *data, int index, int end) {
if (index == end) {//当我分到最后一个数字了,判断条件
for (int i = 0; i < end; i++)
printf("%d", data[i]);
printf("\n");
}
else
for (int i = index; i < end; i++) {//从index 开始 其实枝剪了一部分
swap(data[i], data[index]);//交换
perm(data, index + 1, end);//dfs调用
swap(data[i], data[index]);//复原
}
}
int main() {
int data[] = { 1,2,3 };
perm(data, 0, 3);
return 0;
}
提示:
如果你不慎一步步带入了步骤且现在被饶了进去不知所踪。
我们利用最少的数字去思考,即1,2两个数字!
- 1:我们第一步直接走到index==end 输出 1,2;
- 2:我们还原之后再到下一个循环去 data[1]与data[0]做交换,data[1]与data[1]交换,保持原样,index=2输出,2,1;
#include "stdio.h"
#include "windows.h"
void swap(int &a, int &b) {
int t = a;
a = b;
b = t;
}
void perm(int *data, int index, int end) {
if (index == end) {
for (int i = 0; i < end; i++)
printf("%d", data[i]);
printf("\n");
}
else
for (int i = index; i < end; i++) {
swap(data[i], data[index]);
perm(data, index + 1, end);
swap(data[i], data[index]);
}
}
int main() {
int data[] = {1,2};
perm(data, 0, 2);
return 0;
}

浙公网安备 33010602011771号