【问题标题】:How to sort multiple strings alphabetically without using built-in functions如何在不使用内置函数的情况下按字母顺序对多个字符串进行排序
【发布时间】:2018-01-19 22:38:09
【问题描述】:

我必须在没有任何内置函数的情况下按字母顺序对一组字符串进行排序,然后将它们打印在屏幕上。我尝试将字符串的第一个字符转换为数字值,然后将该值与字符串的其他第一个字符进行比较,但我认为这不是一个好的选择。

(类似的)

for (int i = 0; i < numberOfStrings; i++)
{
  for (int j = i + 1; j < numberOfStrings; j++)
  {
    if ((int)string1[i] > (int)string2[i]         
    {
      biggestFirstChar = (int)string1[i];
    }
  }
}

所以我想知道在没有任何函数的情况下按字母顺序对多个字符串进行排序的简单方法是什么。这是学校作业。

【问题讨论】:

  • 不要将char 值转换为int。您可以将它们与chars 进行比较。此外,此方法将比较它们的 Unicode 值,但可能不会给您“自然”的排序顺序
  • 了解冒泡排序或快速排序,还有其他的
  • 尝试查看不同的排序算法。或许看看冒泡排序,就很容易理解了。
  • 感谢您的回答。我会查一下冒泡排序。

标签: c# string


【解决方案1】:

由于这是一个家庭作业问题,我将给出一个有效的答案,而不是实际的代码版本...

制定算法的方法

  1. 拿一张纸,撕成几块,然后在每块上写一个字。
  2. 将纸片一个接一个地放置(例如,它们代表一个未排序的数组)
  3. 按照自己的方式完成列表,将项目按顺序排列。尝试采取程序方法;也就是说,您每次做出决定时都在遵守规则,而不是“神奇地”/智能地跳到下一步。
  4. 试着写下你遵守的规则。
  5. 再次将列表弄乱,然后重复,完全遵循您编写的规则;它是否有效,或者您是否遗漏了任何规则/是否存在没有意义的规则。
  6. 此时,您的规则列表基本上是伪代码;即您有一套说明,可以按照这些说明获得结果;但它还没有用任何公认的编程语言编写。
  7. 将这些规则/伪代码转换为实际代码。
  8. 试试看。如果它不起作用,请尝试找出问题所在。如果您看不出有什么问题,请到这里来,发布该代码并说明您的问题;然后,我们可以帮助您重回正轨。

注意:您当然可以查找现有的排序算法并实现它们;但我个人更喜欢上面的方法,因为它教会你自己思考,而不是把现有的算法翻译成你特定的编码语言。

其他提示

进行比较时,请考虑您需要做什么。即您在上面询问过在比较字符串中的字符之前将它们转换为数字。是否需要该步骤?你不能简单地按字母顺序比较字符串吗? https://www.google.co.uk/search?q=c%23+compare+strings+alphabetically

在您提供的代码示例中,您有值 string1string2,但您从未显示它们的值是如何分配的...您需要先为变量分配一个值,然后才能比较它/ 这些任务应该在何时何地进行?

您还有一个循环,其中分配了整数j...您在哪里使用该值/除非您要使用它,否则为它分配一个值有什么意义?

同样你有一个变量biggestFirstChar,你给它赋值,但不要做任何事情。是否需要/您会在哪里使用它?

您所追求的结果是一个排序后的值列表,然后您希望将其输出。您在哪里保存该结果/按顺序输出结果的代码在哪里?

您希望如何构建该结果列表;即您是否能够一次全部填充它,还是必须一点一点地修改它,直到所有项目都按顺序排列?

此外,将问题分解为多个块并测试每个块和/或考虑其影响。即

  • 如何产生输出?
  • 如何比较 2 个字符串以确定哪个应该在列表中排在首位?
  • 如何输出数组(列表)?
  • 如何将项目添加到结果列表(或者如果您正在处理原始列表,如何交换现有列表中的值)?
  • 给定一个包含 2 个元素(项)的数组(列表),编写代码将它们按顺序排列。确保无论初始顺序如何(Aardvark, BalloonBalloon, Aardvark)都能正常工作。
  • 现在将其扩展为适用于包含 3 个项目的列表;但请确保您的解决方案在给出 2 个项目的列表时仍然有效。
  • 现在尝试解决原来的问题
  • 最后(可选;加分)查看您的代码,看看您是否可以改进(即重构它)。这意味着查看简单的演示文稿(您是否缩进了您的代码/您是否使用了有意义的变量和函数名称,您是否评论了任何不能自我解释的内容等),并寻找改进它的方法(您能看到一些低效的东西吗?不同的方法可能会更好地工作/是否有任何重复的代码可以移出到不同的函数中并从所有需要的地方调用?

【讨论】:

  • 感谢您的提示。我会考虑采用这种方法。
【解决方案2】:

您需要两种方法,冒泡排序(或任何排序算法)和字符串比较算法。

你已经知道冒泡排序,所以我去比较字符串。

int Compare(string x, string y)
{
    if(x == y) return 0;
    if(x == null) return -1;
    if(y == null) return 1;

    int i = 0;
    int length = x.Length <= y.Length ? x.Length : y.Length;

    while(i < length)
    {
        if(x[i] > y[i]) return 1;
        if(x[i] < y[i]) return -1;
        i++;
    }

    if(x.Length == y.Length) return 0;
    if(x.Length > y.Length) return 1;
    else return -1;
}

只需在冒泡排序算法中使用此比较算法即可。

比较两个字符串

if(Compare(str1, str2) >= 0)
{
    // str1 is bigger or equal
}
else 
{
    // str2 is bigger.
}

【讨论】:

  • 谢谢,这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 2015-09-03
  • 2016-04-28
  • 2014-11-13
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 1970-01-01
相关资源
最近更新 更多