对整数进行排序



我有一个包含~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),速度较慢。

您在已删除的帖子中评论说V1已经排序。

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

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

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

仅在V1已排序时才有效。

作为一个可能的选择,你可以尝试数组而不是列表。(这取决于您的上下文(。如果您不能:

假设:

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;
}
}

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

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;
}

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

if (l1.V1 == l2.V1)
{
if (l1.V2 > l2.V2) return 1;
else return -1;
}
else if (l1.V1 < l2.V1)
return -1;
else return 1;

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

相关内容

  • 没有找到相关文章

最新更新