大一的时候没有好好学,后来都是要还的QAQ
大三重修了C语言(刷分)。再次遇到了全排列这道题,之前是直接抄的书上的代码,没有认真理解意思。在大二学习中也知道了全排列是依靠递归实现的,索性这次就没有参考文章,自己写了一个全排列出来。(代码运行效率看起来还可以)
核心思想是递归地交换两个数字。for循环意味着对level-1之后的数字遍历交换一次。
因为交换了数字,所以在递归出口的时候要把之前的交换还原。(想象整个过程,而不是细节就会明白)
写出来也挺简单的,十几分钟的事情orz,还是大一太佛了,没有认真学习,否则现在也不会这么艰难啊QAQ。
不说了不说了,最后附上代码:
输入:一个数字n,代表hash数组中的前几位参与全排列。
输出:数字的全排列,以从小到大的顺序排列,共$A^n_n$个
#include <stdio.h> int hash[15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}; int loc; void print() { int i; for(i = 0; i < loc; i++) printf("%d ", hash[i]); printf("\n"); return; } void swap(int src, int dst) { int temp; temp = hash[src]; hash[src] = hash[dst]; hash[dst] = temp; } void sort(int level) { int i; if(level == loc){ print(); return; } sort(level + 1); for(i = 0; i+level < loc; i++){ swap(level + i, level - 1); sort(level + 1); } for(i = loc - level - 1; i>= 0;i--) swap(level+i, level - 1); } int main() { scanf("%d", &loc); sort(1); return 0; }