【问题标题】:Getting wrong result in sorting Arrays在排序数组时得到错误的结果
【发布时间】:2016-10-23 09:16:21
【问题描述】:

我正在练习 C#,并编写了下面的代码,不包括以“Array.Sort....”开头的行。输出符合预期(即“5,7,2”)。

当我包含“Array.Sort...”行时,我期望得到“2,5,7”,但得到了输出“5,5,7”,即 2 已经消失并且已经不知何故被5取代。任何人都可以帮助解释为什么(对初学者)?

namespace ConsoleApplication33
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] numbers = new int[3] { 5, 7, 2 };

            for (int i = 0; i< numbers.Length; i++)
            {
                Console.Write(numbers[i] + " , ");
                Array.Sort(numbers);

            }
            Console.ReadKey();
        }

    }
}

【问题讨论】:

    标签: c# arrays sorting


    【解决方案1】:

    您不需要for 循环来进行排序。只需 Array.Sort 即可对您的数组进行排序:

    int[] numbers = new int[3] { 5, 7, 2 };
    Array.Sort(numbers);
    

    对数组排序后,可以像这样打印排序后的数组:

    for (int i = 0; i< numbers.Length; i++) {
        Console.Write(numbers[i] + " , ");
    }
    

    【讨论】:

      【解决方案2】:

      你在一个循环中排序,在前面写入 i 值。所以你的代码是这样工作的

      • 写第一项(5)
      • 对数组进行排序
      • 写第二条(现在是5条)
      • 对数组进行排序
      • 写第三项(现在是7)

      您可能想要对数组进行排序,然后将其写出来:

      int[] numbers = new int[3] { 5, 7, 2 };
      
      Array.Sort(numbers);
      
      for (int i = 0; i< numbers.Length; i++)
      {
          Console.Write(numbers[i] + " , ");
      }
      

      顺便说一句,您还可以使用 string.Join 并避免循环(和尾随逗号):

      var commaSeparatedNums = string.Join(", ", numbers);
      Console.Write(commaSeparatedNums);
      

      【讨论】:

        【解决方案3】:

        Array.sort是一个不需要任何循环迭代的方法,调用它就足够了

        您的问题是因为您循环和排序 3 次,这是完全没有必要的... 现在,您将元素置于 i 位置,然后排序并执行 3 次...查看动画以获得更多说明性说明

        您排序正确,但正在按索引读取数组索引的元素,这是不正确且没有必要的

        去掉for循环的洞,只调用Array.Sort(numbers);

        //for (int i = 0; i< numbers.Length; i++)
        //{
             //Console.Write(numbers[i] + " , ");
             Array.Sort(numbers);
        //}
        

        【讨论】:

          【解决方案4】:

          您正在循环中对数组进行排序。排序仅在第一次应用时更改数组;排序的第二次和第三次调用不会更改数组。

          第一个打印输出发生在未排序的数组上;第二个打印输出发生在排序后的数组上。第一次围绕5 是初始号;第二次,5 在中间。这就是为什么您看到5 打印了两次。

          您需要在进入打印循环之前对数组进行一次排序以解决此问题:

          Array.Sort(numbers);
          for (int i = 0; i< numbers.Length; i++) {
              Console.Write(numbers[i] + " , ");
          }
          

          【讨论】:

          • 谢谢大家。我现在按照你的解释明白了。感谢您的帮助:)
          【解决方案5】:

          使用无循环的 Array.Sort。如果你想对数组进行排序。

          int[] numbers = new int[3] { 5, 7, 2 };
          Array.Sort(numbers);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-27
            • 1970-01-01
            • 1970-01-01
            • 2020-03-01
            • 2023-02-11
            • 1970-01-01
            相关资源
            最近更新 更多