next permutation c语言,C语言版 next_permutation(排列)

列出数组元素的所有排列是一项比较常用的功能。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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值