C 按字母顺序排列

C 按字母顺序排列,c,permutation,C,Permutation,我正在努力完成我的任务。我们的任务是对输入进行所有可能的排列(已按字母顺序排列)。我的代码只适用于3个字符,在这之后,它就不做我期望它做的事情了。我已经找了5个小时的错误,但没有成功 void perm(char *input_arr, int len_arr, int done) { if (done == len_arr - 1) { for (int i = 0; i < len_arr; i++) { printf("%c", per

我正在努力完成我的任务。我们的任务是对输入进行所有可能的排列(已按字母顺序排列)。我的代码只适用于3个字符,在这之后,它就不做我期望它做的事情了。我已经找了5个小时的错误,但没有成功

void perm(char *input_arr, int len_arr, int done) {
    if (done == len_arr - 1) {
        for (int i = 0; i < len_arr; i++) {
            printf("%c", perm[i]);
        }
        printf("\n");
    } else {
        for (int i = done; i < len_arr; i++) {
            swapityy_swap(&perm[done], &perm[i]);
            sperm(perm, len_arr, done + 1);
            swapityy_swap(&perm[done], &perm[i]);
        }
        qsort(perm, len_arr, sizeof(char), compity_dawg);
    }
}
void perm(char*input\u arr,int len\u arr,int done){
如果(完成==len_arr-1){
对于(int i=0;i

希望收到您的来信,luv给定一组字符,比如说
“acute”
,您可以按字母顺序进行下一次排列:

  • 识别单词的反向排序后缀(“尾”);在本例中,它是
    “ute”
  • 如果后缀是整个单词,那么您有最后一个排列–stop;否则取后缀前面的字符;在这个例子中,它是
    'c'
  • 在后缀中找到比前一个字符大的最小字符;在本例中,
    “ute”
    中大于
    'c'
    的最小字符是
    'e'
  • 交换它们;您得到的后缀是
    “utc”
    ,前面是
    “e”
  • 将后缀中的字符反转(按字母顺序排序),然后进行下一个排列:
    “aectu”
如果您开始对按字母顺序给出的字符串(例如,
“acetu”
)迭代上述算法,您将按字母顺序获得所有排列,并以逆字母顺序停止字符串(
“uteca”

编辑1

由于“最小字符大于”的要求,该算法可以正确处理重复字符。例如:对于
“tada”
,它将识别后缀
“da”
,并将前面的
'a'
替换为
'd'
,而不是最后一个
'a'
,因此找到的下一个排列是
“tdaa”

因此,与只使用字符位置的算法不同,该算法会按字母顺序查找所有不同的排列。

至少如果您将“工作”定义为通过参数
input\u arr
接收的数组的打印排列,则您所呈现的代码似乎根本不可能工作。它必须实际检查数组的内容才能实现这一点。在这之前,它必须实际编译。当询问运行时错误时,就像这个问题所做的那样,它需要发布干净编译、简短并且仍然显示错误的代码。发布输入数据、发布实际输出、发布预期输出。为了便于阅读和理解:1)通过一个空行分离代码块(for、if、else、while、do…while、switch、case、default)。2) 遵循公理:*每行只有一条语句,每条语句最多只能声明一个变量。(将右大括号“}视为单独的语句。发布的代码缺少#include语句、输入数据、预期输出、实际输出、main()函数、comity_dawg()函数。swapityy_swap()函数。发布的函数名为:perm()它有3个参数,但这些递归调用只有一个参数。我会在上面@user3629249所说的基础上增加一个参数:一个库函数
qsort
对数组进行排序,但你要向它传递一个函数(第一个参数是
perm
)!与
swapityy_swap
调用相同的问题…此外,您进行类似于递归调用的调用–但被调用方实际上不是调用方(
smemer
vs.
perm
)!一般来说:这不是正在运行的代码,甚至不是可编译的代码。它根本不起作用。