【问题标题】:Logic challenge: sorting arrays alphabetically in C逻辑挑战:在 C 中按字母顺序对数组进行排序
【发布时间】:2013-08-23 17:29:13
【问题描述】:

我是编程新手,目前正在学习 C。我已经在这个问题上工作了一周,但我似乎无法理清逻辑。这直接来自我正在使用的书:

构建一个使用字符串数组存储以下名称的程序:

  • “佛罗里达”
  • “俄勒冈”
  • “加利福尼亚”
  • “格鲁吉亚”

使用前面的字符串数组,编写您自己的sort() 函数,使用strcmp() 函数按字母顺序显示每个州的名称。

所以,假设我有:

char *statesArray[4] = {"Florida", "Oregon", "California", "Georgia"}; 

我应该嵌套for循环吗,比如strcmp(string[x], string[y])...?我已经破解并破解了。我只是无法理解解决这个问题所需的算法,甚至有点有效。帮助 非常感谢!!!

【问题讨论】:

  • 你可能应该对排序算法做一点研究,数字列表排序和单词列表按字母顺序排序的唯一区别是比较方法,这很容易做到
  • 退后一步,去喝杯好茶什么的。当你回到这一点时,一次迈出一步。首先填充该数组,然后您可以担心排序。
  • @GeorgeMitchell 1) 对 4 个元素进行快速排序? 2)鉴于发帖者对编程比较陌生,如果他进行冒泡/插入/选择排序可能会更好,只是为了能够编写逻辑。
  • @GeorgeMitchell 快速排序对于初学者来说可能不是最简单的解决方案。我建议从物理类比开始 - 如果我给你一堆棒球卡或其他东西,并告诉你对它们进行分类,你会怎么做?很少有人会想出快速排序。我怀疑大多数人基本上会从插入或选择排序开始。

标签: c algorithm sorting strcmp


【解决方案1】:

假设您必须对数组进行排序 - 想想写在卡片上的每个状态。你会如何把它排序。有很多方法可以做到这一点。每一个都称为一个算法

一种方法是通过查看每张牌并在脑海中跟踪你见过的最低一张来找到第一个状态。查看每张卡片后,您将拥有最低的一张。把它放在一个新的堆里。现在重复一遍 - 试图找到你剩下的最低的。

重复直到原来的牌堆没有牌

这是一个众所周知的简单但缓慢的算法。这是我会先做的一个

还有其他的

【讨论】:

    【解决方案2】:

    是的,您可以使用嵌套的 for 循环进行排序。在您了解 strcmp() 的工作原理后,它应该相当简单:

    strcmp(char *string1, char *string2)

    • 如果返回值为< 0,则表示string1小于string2

    • 如果返回值为> 0,则表明string2小于string1

    • 如果返回值为= 0,则表示string1等于string2

    您可以从此时开始选择任何一种排序方法

    This site 有大量正在执行的各种精彩图形示例,其中包括给定算法的伪代码。

    【讨论】:

      【解决方案3】:

      您需要“任何”排序算法,还是“高效”排序算法?

      为简单起见,我可以向您展示如何实现一种简单但不高效的排序算法。 这是double for 方法!! 然后,使用相同的想法,您可以将其修改为任何其他有效的算法(如 shell 或快速排序)。

      对于数字,您可以将数组按顺序排列,如下所示(您可能知道):

      int intcmp(int a, int b) {
          return (a < b)? -1: ((a > b)? +1: 0);
      }
      
      int main(void) {
         int a[5] = {3, 4, 22, -13, 9};
      
         for (int i = 0; i < 5; i++) {
            for (int j = i+1; j < 5; j++)
               if (intcmp(a[i], a[j]) > 0) {
                  int temp = a[i]; 
                  a[i] = a[j]; 
                  a[j] = temp; 
               }
             printf("%d ", a[i]);
         }
      }
      

      现在唯一改变的是你有字符串而不是整数。 所以,你必须考虑一个字符串数组:

       char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
      

      然后,您必须将temp的类型更改为char*
      最后你把函数strcmp() 代替intcmp()

      函数strcmp(s1, s2)(来自) 如果 s1 是“小于”s2 的字符串,则返回数字 1 否则。

      程序如下所示:

      #include <stdio.h>
      #include <string.h>
      int main(void) {
         char *a[] = {"Florida", "Oregon", "Califoria", "Georgia"};
      
         for (int i = 0; i < 4; i++) {
            for (int j = i+1; j < 4; j++)
               if (strcmp(a[i], a[j]) > 0) {
                  char* temp = a[i]; 
                  a[i] = a[j]; 
                  a[j] = temp; 
               }
             printf("%s ", a[i]);
           }
         getchar();
         return 0;  
      }
      

      请注意,对于printf() 语句,我们已将"%d " 更改为"%s ",以便正确显示字符串。

      最后的评论:当你编写一个更好的算法时,比如快速排序,你改变比较函数就足够了,因为算法是一样的,无论您要比较的数据类型如何。

      备注:我使用了一种“棘手”的方法。如您所见,我已将变量a 定义为指向字符串的指针。初始化程序采用了一个常量字符串数组,然后用它初始化变量a。变量 a 现在可以安全地处理和索引为正好 4 个指向字符串的数组。
      这就是为什么“交换”在双换算法中可以正常工作的原因:内存地址被交换,而不是 整个 字符串。

      【讨论】:

        【解决方案4】:

        您可能应该采取的步骤:

        1. 使用状态名称填充数组
        2. 创建方法来交换数组中的两个状态
        3. 此时,您拥有使用 strcmp 实现您选择的任何排序算法所需的所有工具

        大多数排序方法依赖于两件事。

        1. 能够重新排列列表(即交换)
        2. 能够比较列表中的项目以查看它们是否应该交换

        我会努力让这两件事正常工作,其余的应该只是学习一种特定的排序算法

        【讨论】:

          【解决方案5】:

          注意一个令人头疼的问题:字符串是按 ascii 数字表示排序的,所以如果你像这样按字母顺序排序,任何大写字母都会出现在小写字母之前,例如“alpha”、“beta”、“gamma”、“Theta”将排序为: θ、α、β、γ

          【讨论】:

            【解决方案6】:

            对于您在此处列出的示例数组,前面提到的简单算法实际上可能是最有效的。我所指的算法是你从第一个元素开始,然后将它与其他元素进行比较,然后用你找到的最小元素替换,然后去下一个元素做同样的事情,只是不要将它与已经排序的元素进行比较元素。

            虽然此算法的执行时间为 O(n^2)。其中 n 是数组中元素的数量。对于较小的数组,它通常比快速排序(执行时间 O(n*log(n)))更快。原因是快速排序有更多开销。对于较大的数组,快速排序会比其他方法更好地为您服务,如果我没记错的话,这被称为替换排序,尽管我看到它在不同的答案中被称为“double for”。

            【讨论】:

              猜你喜欢
              • 2013-05-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-12
              相关资源
              最近更新 更多