我无法在逻辑上做到这一点。我已经绘制了所有可能的排序方法,并基于此算法。
ABC
ACB
BAC
BCA
CAB
CBA
3个字符串只有6种可能的组合,所以,我认为这是一个非常快速简单的解决方案,用条件码对其进行硬编码。见代码;
char str1[x]; // where x is some constant value
char str2[x];
char str3[x];
char temp[x];
if (strcmp(str1, str2) > 0)
{
strcpy(temp, str1);
strcpy(str1, str2);
strcpy(str2, temp);
}
else if (strcmp(str2, str3) > 0)
{
strcpy(temp, str2);
strcpy(str2, str3);
strcpy(str3, temp);
}
else if (strcmp(str1, str3) > 0)
{
strcpy(temp, str1);
strcpy(str1, str3);
strcpy(str3, temp);
}
基本上我想以ABC的任何变体为例,并将其分类为ABC。即BAC - > ABC,CAB - > ABC
答案 0 :(得分:1)
你非常接近。你最大的问题是那些else
。通过使用else if
,您确保最多可以运行一个if
块,这意味着您可以通过代码执行四种可能的路径 - 第一个块运行,或第二个块运行,或第三个块运行,或者没有运行。但这不正确,因为你自己指出有六种情况需要考虑。
其次,您有一个轻微的订购问题,可以通过交换第二个和第三个块来解决。
如果你进行了这两项修改,你应该有一些有用的东西。首先根据需要与str1
交换str2
,然后根据需要交换str1
和str3
,确保最小值最终在str1
,并且仅两个较高的值保留在str2
和str3
中(按未知顺序)。然后,如果需要,可以通过str2
与str3
进行交换,确保这两者的顺序正确,因此整个过程必须按顺序排列。
答案 1 :(得分:0)
您是否尝试使用字符串实现冒泡排序? Take a look here
这是一个用于字符串的小代码:
#include <stdio.h>
#include <string.h>
#define strSize 20
int main() {
char strings[][strSize] = {"CBA", "CAB", "BCA", "BAC", "ACB", "ABC"};
char tmp[strSize];
size_t len = sizeof(strings)/sizeof(strings[0]);
for (size_t j = 1; j < len; ++j) {
for (size_t i = 1; i < len; ++i) {
strcpy(tmp, strings[i - 1]);
if (strcmp(strings[i], tmp) < 0) {
strcpy(strings[i - 1], strings[i]);
strcpy(strings[i], tmp);
}
}
}
for (size_t i = 0; i < len; ++i) {
printf("%s ", strings[i]);
}
}