是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?

Posted

技术标签:

【中文标题】是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?【英文标题】:Is it possible to sort arrays based on multiple criteria using merge sort (C#)? 【发布时间】:2020-08-23 03:37:48 【问题描述】:

假设我在控制台应用程序中获得以下输入行:

A 10 20 30
B 5 10 40
C 40 10 20
D 30 25 10

字母代表产品名称、第二价值价格、第三产品分数和第四产品耐力。我想首先根据价格对这个列表进行排序。如果两个产品的价格相同,则根据产品分数进行排序。如果两个产品的价格和产品分数相同,我想按产品耐用性排序,最后按名称排序。这可以使用归并排序吗?如果是这样,我应该如何解决这个问题?我无法将所有这些值存储到一个数组中并将其传递给合并排序算法,因此我必须创建多个数组。但是我如何跟踪数组的哪些值属于一起呢?我想在 C# 中执行此操作。

【问题讨论】:

我无法将所有这些值存储到一个数组中并将其传递给归并排序算法 为什么不能创建这样的数组?这是对此类数据进行排序的最方便的方法。首先,您应该创建一个类来保存每一行的所有值。然后为这个类定义比较器。最后使用标准库使用创建的比较器对对象数组进行排序。 【参考方案1】:

您可以简单地在元素列表中使用OrderByThenBy。示例如下:

void Main()

    var products = new List<Product>();
    products.Add(new Product()  Name = "A", Price = 10, Score = 20, Endurance = 30 );
    products.Add(new Product()  Name = "B", Price = 5, Score = 10, Endurance = 40 );
    products.Add(new Product()  Name = "C", Price = 40, Score = 10, Endurance = 20 );
    products.Add(new Product()  Name = "D", Price = 30, Score = 25, Endurance = 10 );

    var resultsSorted = products
                        .OrderBy(p => p.Price)
                        .ThenBy(p => p.Score)
                        .ThenBy(p => p.Endurance)
                        .ThenBy(p => p.Name);


class Product

    public string Name  get; set; 
    public decimal Price  get; set; 
    public int Score  get; set; 
    public int Endurance  get; set; 


[更新]

您确实问过如何正确打印这些产品,因为 Console.WriteLine(product) 没有打印产品的“详细信息”。当然,这是因为您最终在对象上使用了 .ToString() 方法的默认实现。您必须在 foreach 循环中自己创建此字符串 - 或覆盖 .ToString() 方法,因此它是:

   foreach(var product in resultsSorted)
   
      Console.WriteLine($"Name:Name, Price:Price, Score:Score, Endurance:Endurance");
   

或覆盖.ToString


class Product

    public string Name  get; set; 
    public decimal Price  get; set; 
    public int Score  get; set; 
    public int Endurance  get; set; 
    public override string ToString()
    
        return $"Name:Name, Price:Price, Score:Score, Endurance:Endurance";
    

然后你可以使用:

foreach (var product in resultsSorted)

   Console.WriteLine(product);

【讨论】:

谢谢,这有帮助。我怎样才能将列表的值写入控制台?例如,如果我尝试 foreach (var a in products) Console.WriteLine(a) 我得到 namespace.Product 我已经为你扩展了你的问题;)

以上是关于是否可以使用归并排序 (C#) 基于多个条件对数组进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

对多个有序数组,实现归并操作

算法_归并排序

JS对象数组多条件排序

排序算法: 归并排序

算法 | 归并排序

Java排序之归并排序