C 按字母顺序排列
我正在努力完成我的任务。我们的任务是对输入进行所有可能的排列(已按字母顺序排列)。我的代码只适用于3个字符,在这之后,它就不做我期望它做的事情了。我已经找了5个小时的错误,但没有成功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
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
)!一般来说:这不是正在运行的代码,甚至不是可编译的代码。它根本不起作用。