排序整数对

时间:2017-07-10 13:59:47

标签: c# .net sorting graphics quicksort

我有一个包含~100k整数对的列表,如下所示:

0, 12
0, 14
0, 1
0, 8
0, 2
0, 4
0, 3
1, 5
1, 11
1, 8
1, 2
2, 7
2, 9
2, 4
2, 5
2, 13
3, 12
3, 10
3, 4
3, 6
...

我需要像

那样对它们进行排序
0, 1
0, 2
0, 3
0, 4
0, 8
0, 12
0, 14
1, 2
1, 5
1, 8
1, 11
2, 4
2, 5
2, 7
2, 9
2, 13
3, 4
3, 6
...

目前我在做:

myList.Sort(comparer);

比较器定义为:

class EdgeIntersectComparer : IComparer<EdgeIntersect>
{
   public int Compare(EdgeIntersect l1, EdgeIntersect l2)
   {
       if (l1.V1 < l2.V1)
          return -1;
       if (l1.V1 > l2.V1)
          return 1;

       if (l1.V2 < l2.V2)
          return -1;
       if (l1.V2 > l2.V2)
          return 1;

       return 0;
   }
}

我可以做些什么来提高执行速度?有没有更聪明的方法解决这个问题?

感谢。

修改

经过测试myList.OrderBy(e => e.V1).ThenBy(e => e.V2)并且速度较慢。

3 个答案:

答案 0 :(得分:1)

您已在已删除的帖子中注释V1已排序。

  

此外,通过V1,列表已经排序。

我使用已经由V1订购的数据进行了测试,但V2使用随机数进行了初始化。我发现这比你的方法更快:

myList = myList.GroupBy(x => x.V1).SelectMany(x => x.OrderBy(y => y.V2)).ToList();

如果V1已经排序,则此有效。

答案 1 :(得分:0)

作为一种可能的选择,您可以尝试使用Array而不是List。 (这取决于你的背景)。如果你不能:

Asuming:

 public class Pair
{
    public int First { get; private set; }
    public int Second { get; private set; }
    public Pair(int first, int second)
    {
        this.First = first;
        this.Second = second;
    }
}

如何按第一项排序List,也许是这样的?不确定这是否会更快:

    public static List<Pair> FullOrderedList(List<Pair> SemiOrderedList)
    {
        List<Pair> FList = new List<Pair>();
        List<Pair> demi = new List<Pair>();
        int MaxNumber = SemiOrderedList.Count;
        int compared = 0;
        for (int i = 0; i < MaxNumber; i++)
        {
            int first = SemiOrderedList[i].First;
            if (compared == first)
            {
                demi.Add(SemiOrderedList[i]);
            }
            else
            {
                compared++;
                FList.AddRange(demi.OrderBy(x => x.Second));
                demi.Clear();
            }
        }
        return FList;
    }

答案 2 :(得分:-1)

通过优化比较器可以获得小幅度的提升:

[{id:123,
image:image,
desc : "hello here is a comma , I am after the comma"}]

要检查的最多2个语句,而不是您的4个。