全排列

全排列

1. next_permutation函数
  • 基本概念:全排列是指长度为n的数列a1,a2,...,an所有可能的排列组合,共有n!种排列方式。

  • 功能说明

    • 按照字典序生成当前序列的下一个排列

    • 若存在下一个排列,修改当前序列并返回true

    • 若已是最后一个排列,将序列重置为第一个排列并返回false

  • 字典序规则:从前向后比较,第一个不相同的位置决定大小关系(如ABC的下一个是ACB)

  • 使用要求:若要生成完整全排列,初始序列必须是最小字典序排列(如{1,2,3})

  • 代码示例:

vector<int> nums = {1,2,3};
while(next_permutation(nums.begin(), nums.end())){
    // 输出每个排列
}
2. prev_permutation函数
  • 功能对比:与next_permutation相反,生成当前序列的上一个排列

  • 工作逻辑

    • 存在上一个排列时修改序列并返回true

    • 已是第一个排列时重置为最后一个排列并返回false

  • 使用要求:初始序列需为最大字典序排列(如{3,2,1})

  • 典型应用:两种函数都可替代DFS实现全排列枚举,代码更简洁

3. 例题: next_permutation函数应用
  • 实现要点

    • 使用数组或vector存储序列(示例使用int a[10])

    • 循环条件通过bool tag控制,初始设为true保证首次执行

    • tag=next_permutation(a+1,a+1+4);

    • 参数传递区间地址(数组用a+1, a+1+4)

  • 特殊现象

    • 从中间状态开始生成时(如{2,3,4,1}),仍会遍历到字典序终点

    • 到达终点后函数会将序列重置为最小排列(如{4,3,2,1}→{1,2,3,4})

  • 注意事项

    • 函数名拼写需准确(常见错误如next_pernutation)

    • 区间参数范围要正确包含所有元素

    • 输出时注意处理末尾空格和换行

posted @ 2026-04-08 13:16  Sherry_pro  阅读(3)  评论(0)    收藏  举报