《数据结构(C语言版)》学习笔记:递归的全排列产生算法(p8)
算法C语言实现
1 | void perm(char *list, int begin, int end) |
为什么会有2次交换数据
第一次交换是为了将list[i]
设置为排列首元素,第二次交换是为了恢复第一次交换之前的状态,以保证循环依次遍历不同元素。
以序列{a, b, c, d}
为例,循环并交换list[i]
与list[begin]
,使a,b,c,d
依次为首元素;
以a
为首元素,list[0]
与list[0]
交换,顺序不变;
以b
为首元素,list[1]
与list[0]
交换,顺序变为{b,a,c,d}
,第一个元素选定之后,对{a,c,d}
递归执行全排列,执行完成之后,下一次循环之前,需要将list[1]
与list[0]
再次交换,以恢复到{a, b, c, d}
的顺序,这样,下次循环,再交换list[2]
与list[0]
,才能使得字符c
为首元素;
同理可以分析以c
和d
为首元素的情况。
测试主函数
1 |
|