使用C

时间:2017-09-29 01:59:25

标签: c sorting strcmp strcpy lexicographic

我无法在逻辑上做到这一点。我已经绘制了所有可能的排序方法,并基于此算法。

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

2 个答案:

答案 0 :(得分:1)

你非常接近。你最大的问题是那些else。通过使用else if,您确保最多可以运行一个if块,这意味着您可以通过代码执行四种可能的路径 - 第一个块运行,或第二个块运行,或第三个块运行,或者没有运行。但这不正确,因为你自己指出有六种情况需要考虑。

其次,您有一个轻微的订购问题,可以通过交换第二个和第三个块来解决。

如果你进行了这两项修改,你应该有一些有用的东西。首先根据需要与str1交换str2,然后根据需要交换str1str3,确保最小值最终在str1,并且仅两个较高的值保留在str2str3中(按未知顺序)。然后,如果需要,可以通过str2str3进行交换,确保这两者的顺序正确,因此整个过程必须按顺序排列。

答案 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]);
  }
}