C语言实现全排列算法(附详细注释)

在这篇文章中,我们将使用C语言实现一个经典算法:全排列。为了方便理解,代码中添加了详细的注释。c#include <stdio.h>

// 交换两个元素的值void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp;}

// 生成全排列void generatePermutations(char *str, int start, int end) { // 当递归到最后一个字符时,输出全排列 if (start == end) { printf('%s ', str); return; }

for (int i = start; i <= end; i++) {        // 将第i个字符与第start个字符交换        swap((str + start), (str + i));

    // 递归生成剩下的全排列        generatePermutations(str, start + 1, end);

    // 恢复原始顺序,以便进行下一次交换        swap((str + start), (str + i));    }}

int main() { char str[] = 'ABC'; // 输入字符串 int n = sizeof(str) - 1; // 字符串长度(去除空字符)

printf('全排列:

'); generatePermutations(str, 0, n - 1);

return 0;}

代码解析

这段代码的核心是递归函数generatePermutations,它接受三个参数:

  • str:待排列的字符串。- start:当前要固定的字符位置。- end:字符串的结束位置。

算法步骤:

  1. 递归基准:start等于end时,说明已经递归到最后一个字符,此时可以输出当前排列的字符串。

  2. 迭代交换:startend,依次将每个字符与第start个字符交换。

  3. 递归调用: 每次交换字符后,递归调用generatePermutations函数,处理剩余字符的排列。

  4. 恢复状态: 在递归调用返回后,需要将之前交换的字符恢复到原始位置,以便进行下一次迭代。

示例

以字符串'ABC'为例,全排列的过程如下:

  1. 固定'A',递归生成'BC'的全排列:'ABC','ACB'。2. 固定'B',递归生成'AC'的全排列:'BAC','BCA'。3. 固定'C',递归生成'AB'的全排列:'CAB','CBA'。

希望这个例子可以帮助你理解全排列算法的实现过程。如果你有任何问题,请随时提出。


原文地址: https://www.cveoy.top/t/topic/Z8L 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录