【问题标题】:Sorting 3 strings Lexicographically using conditionals in C [closed]使用C中的条件按字典顺序对3个字符串进行排序[关闭]
【发布时间】:2018-03-10 21:03:35
【问题描述】:

我无法在逻辑上全神贯注地做这件事。我已经列出了排序的所有可能性,并以此为基础。

ABC

ACB

BAC

BCA

驾驶室

CBA

3 个字符串只有六种可能的组合,因此,我认为使用条件对其进行硬编码是一种非常快速且简单的解决方案。见代码;

  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。

【问题讨论】:

  • 1) 你的问题是什么? 2)正如你所说,有六种不同的可能性,但你的代码只能采用四种不同的执行路径(它运行第一个 if 块,第二个,第三个,或者都不运行)。这不是一个好兆头。
  • 我认为你不需要elses。
  • 删除 else 使其适用于除 CBA 和 BCA 之外的所有内容

标签: c sorting strcmp strcpy lexicographic


【解决方案1】:

你很亲密。你最大的问题是那些elses。通过使用else if,您可以确保至多有一个if 块可以运行,这意味着您可以通过代码采用四种可能的路径——第一个块运行,或第二个块运行,或者第三个块运行,或者它们都不运行。但这不可能是正确的,因为您自己指出有六种情况需要说明。

第二,你有一个轻微的排序问题,可以通过交换你的第二个和第三个块来解决。

如果您同时进行了这两项更改,您应该有一些可行的方法。通过首先将str1str2 交换(如果需要),然后交换str1str3(如果需要),您可以确保最小的值最终出现在str1 中,并且只有两个较高的值保留在str2str3(顺序未知)。然后,如果需要,通过将 str2str3 交换,您可以确保这两者的顺序也正确,因此整个事情必须井然有序。

【讨论】:

  • 有道理,解释清楚。
【解决方案2】:

您是否尝试使用字符串实现冒泡排序? 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]);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2023-01-21
    • 2014-02-08
    • 1970-01-01
    相关资源
    最近更新 更多