【问题标题】:how to check if the 2D array is sorted from greatest to lowest如何检查二维数组是否从大到小排序
【发布时间】:2020-06-20 04:23:59
【问题描述】:

如果我有这样的二维数组

  int[,] arr = { { 0, 1, 4 }, { 3, 9, 5 }, { 6, 8, 2 } };
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                Console.Write(arr[i, j] + " ");

            }
            Console.WriteLine();

        }

结果:

0 1 4
3 9 5 
6 8 2

我想检查它是否是从高到低的排序器,例如 80 我在想可能是一个 bool 类型来检查它是否正确,但我真的不知道这是否可行

【问题讨论】:

  • 您是否希望它仅在对每个后续一维数组进行排序时才返回 true?例如:[9 6 0] [8 5 2] [4 1 3]
  • 您要检查每个单独的行还是整个数组?
  • 这是作业吗?

标签: c# arrays sorting for-loop


【解决方案1】:

您可以使用Cast 方法将二维数组转换为一维数组。然后确保每个下一项小于或等于上一项,否则数组不按降序排序

int[,] arr = { { 0, 1, 4 }, { 3, 9, 5 }, { 6, 8, 2 } };
var flatten = arr.Cast<int>().ToList();
var isSorted = true;
for (int i = 0; i < flatten.Count() - 1; i++)
{
    if (flatten[i] <= flatten[i + 1])
    {
        isSorted = false;
        break;
    }
}

您还可以使用Zip 方法检查数组是否按降序排序

var flatten = arr.Cast<int>();
var isSorted = flatten.Zip(flatten.Skip(1), (current, next) => current >= next).All(x => x);

【讨论】:

  • hm 我检查了第一个代码,当我有数组 8 7 6 5 4 3 2 1 0 它没有中断
  • @zellez 它不应该中断,因为数组已经按降序排序并且符合您的标准。仅当数组未排序并设置isSorted = false; 循环之前我们假设数组已排序且isSorted = true
  • 当我运行它时,isSorted = true8 7 6 5 4 3 0 1 28 7 6 5 4 3 2 0 1 一起为 true,并且不会更改为 false
  • @zellez 确实如此,刚刚检查了{ 8, 7, 6, 5, 4, 3, 2, 0, 1 } 样本,它在最后一次循环迭代中将isSorted 设置为falseZip 方法的结果相同,请仔细检查您的数据
【解决方案2】:

如果要检查整个数组是否已排序,可以使用 Linq as

var flattedList = arr.OfType<int>().ToList();
var result = flattedList.OrderByDescending(x=>x).SequenceEqual(flattedList);

【讨论】:

    【解决方案3】:

    对每个后续的一维数组执行排序/检查。这样,您可以检查 x、y 或两者是否按您想要的方式排序。一些排序算法有办法让你知道它们是否是内置排序的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多