列出数组元素的所有排列是一项比较常用的功能。C++ 的 STL 库中自带了 next_permutation (很多其他高级语言也自带了类似功能),不过在纯 C 环境中就不得不自己实现了。算法描述如下:
对于排列,数组的初始状态是元素以升序排列;终止状态时元素以降序排列。比如 1 2 3 三个元素进行排列,最终状态会变成 3 2 1。这一性质也是递归的:即 1 2 3 这个序列,除去第一个元素 1,剩下 2 3 这个子序列,初始状态是 2 3、最终状态时 3 2。
当子序列到达最终状态时,前面的元素要进位(概念和数字进制进位类似)。上述例子中子序列到达 3 2 这个最终状态后,前面的元素是 1,此时要进位变成 2,子序列中的 2 变成 1(序列变成 2 3 1);最后,这个已经到达最终状态的子序列要恢复到初始状态(即反转:2 1 3)。
上述的算法思想虽然是“递归”,不过可以用迭代实现出来。
1.[代码]C语言 next_permutation
#include
#include
#define swap(h, i) do { \
int tmp = list[h]; \
list[h] = list[i]; \
list[i] = tmp; \
} while(0)
typedef enum {
false = 0,
true = !false
} bool;
bool next_permutation(int list[], size_t size) {
size_t