Как быстро сортировать пары чисел (int и double) - PullRequest
1 голос
/ 30 марта 2020

Я создал класс пары и класс массива, но я заблудился о том, как реализовать алгоритм быстрой сортировки. Я хочу сделать это, если целые числа одинаковы, тогда я должен отсортировать по двойному. Мне удалось реализовать быструю сортировку с одним значением на индекс массива, но с этим я просто не могу найти никаких ресурсов.

Может быть, у вас, ребята, есть какие-то ресурсы, или, может быть, у вас была такая же проблема?

Кстати, я пытаюсь реализовать это с 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

    }

Ответы [ 3 ]

1 голос
/ 30 марта 2020

Ваш класс Pair может реализовывать IComparable<T>, а ваш алгоритм быстрой сортировки может быть реализован с использованием метода CompareTo.

Интерфейс IComparable<T>:

Определяет обобщенный метод сравнения, который реализует тип значения или класс для создания специфичного для типа c метода сравнения для упорядочения или сортировки его экземпляров.

Вы можете увидеть документация по методу CompareTo, чтобы увидеть, что означают возвращаемые значения .

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 , В документации, которая мне понравилась, есть примеры того, как это сделать.

0 голосов
/ 30 марта 2020

OrderBy для объектов использует Quicksort - Какой алгоритм сортировки используется LINQ "OrderBy"? - так что вы можете использовать это.

Чтобы избежать создания IComparer<Pair> интерфейса, вы можете создать его используя Comparer<T>.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();
0 голосов
/ 30 марта 2020
//sort for integer
var SortedIntegerList = data.OrderBy(x=>x.integer);
//sort for double
var SortedDoubleList = data.OrderBy(x=>x.doubl);
...