【问题标题】:How to quicksort pairs of numbers(int and double)如何快速排序数字对(int和double)
【发布时间】:2020-07-11 05:43:03
【问题描述】:

我创建了对类和数组类,但我不知道如何实现快速排序算法。 如果整数相同,我想这样做,那么我应该按双倍排序。我能够用每个数组索引一个值来实现快速排序,但是我找不到任何资源。

也许你们有一些资源,或者你们有同样的问题?

顺便说一句,我正在尝试用 c# 来实现它。

这是我的双人班:

class Pair
{
    public int integer = 0;
    public double doubl = 0.0;

    public Pair(int integer, double doubl)
    {
        this.integer = integer;
        this.doubl = doubl;
    }

    public Pair()
    {

    }
    public int Integer() { return integer; }
    public double Doubl() { return doubl; }
}

还有我的数据数组类

class MyDataArray : DataArray
{
    Pair[] data;
    int operations = 0;
    public MyDataArray(int n, int seed)
    {
        data = new Pair[n];
        Random rand = new Random(seed);
        for (int i = 0; i < n; i++)
        {
            data[i] = new Pair(rand.Next(1,100), rand.NextDouble());
        }

    }

    public override int integer(int index)
    {
        return data[index].integer;

    }

    public override double doubl(int index)
    {
        return data[index].doubl;
    }

    public override void Swap(int i, int j)
    {
        Pair temp = data[i]; // c3    1
        data[i] = data[j]; // c3    1
        data[j] = temp; // c3   1

    }

【问题讨论】:

  • 只需比较整数,如果它们相同,则比较双精度数,如您所说。否则,它与按任何东西排序完全相同。
  • 您需要决定是什么让一个实例比另一个更大(您是先按整数排序还是先按双精度排序)。您需要定义相等的含义(请记住,浮点的相等很棘手)。然后您应该实现适当的接口(例如IComparable)并将其用于您的比较。有些规则必须遵守(例如,如果 A>B 且 C>A,则 C>B,但不仅如此)。
  • 旁注:不推荐使用公共字段。同样使用看起来像属性的方法(Integer() 和Doubl())非​​常令人困惑。 public Integer {get;set;} 会更短更传统。

标签: c# .net sorting quicksort


【解决方案1】:

您的Pair 类可以实现IComparable&lt;T&gt;,您的快速排序算法可以使用CompareTo 方法实现。

IComparable&lt;T&gt; 接口:

定义一个值类型或类实现的通用比较方法,以创建一个特定于类型的比较方法,用于对其实例进行排序或排序。

你可以看到documentation on the CompareTo method to see what the return values mean。

public class Pair : IComparable<Pair>
{
    public int integer = 0;
    public double doubl = 0.0;

    public Pair(int integer, double doubl)
    {
        this.integer = integer;
        this.doubl = doubl;
    }

    public Pair()
    {

    }

    public int CompareTo(Pair other)
    {
       if (other == null)
       {
           return 1;
       }
       int result = integer.CompareTo(other.integer);
       if (result == 0)
       {
           result = doubl.CompareTo(other.doubl);
       }
       return result;
    }

    public int Integer() { return integer; }
    public double Doubl() { return doubl; }
}

如果您更喜欢使用比较运算符,您可以按照CompareTo 方法来实现它们。我喜欢的文档中有关于如何做到这一点的示例。

【讨论】:

    【解决方案2】:
    //sort for integer
    var SortedIntegerList = data.OrderBy(x=>x.integer);
    //sort for double
    var SortedDoubleList = data.OrderBy(x=>x.doubl);
    

    【讨论】:

      【解决方案3】:

      OrderBy 对象使用 Quicksort - What Sorting Algorithm Is Used By LINQ "OrderBy"? - 所以你可以使用它。

      为避免创建IComparer&lt;Pair&gt; 接口,您可以使用来自比较委托的Comparer&lt;T&gt;.Create 构造它:

      var sorted = source.OrderBy(x => x, Comparer<Pair>.Create(
            (p1, p2) => p1.Integer() - p2.Integer() != 0 ?
               p1.Integer() - p2.Integer() :
               Math.Sign(p1.Doubl() - p2.Doubl()))).ToList();
      

      【讨论】:

        猜你喜欢
        • 2011-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-27
        • 2014-12-08
        • 1970-01-01
        • 2021-06-15
        相关资源
        最近更新 更多