我目前正在测试什么是按键值排序列表的最佳算法。
我有一个非常简单的对象(以下代码片段来自C#)
class BasicObject
{
int Key;
}
在构造Object时随机设置Key。
所以我有一个BasicObject
对象列表,最后需要按键值排序。
List<BasicObject> basicList = new List<BasicObject>();
for (int i = 0; i < someAmount; i++)
{
basicList.Add(new BasicObject());
}
我的想法是,创建一个名为orderedList
左右的新列表,并每次为每个BasicObject
循环遍历它,并检查其Key是否高于当前值或更低。
这样的事情:
List<BasicObject> orderedList = new List<BasicObject>();
bool objectWasInserted = false;
orderedList.Add(basicList[0]); // Inserting 1 Object as reference for the upcoming loop
for (int i = 1; i < someAmount; i++)
{
objectWasInserted = false;
for (int c = 0; c < orderedList.Count; c++)
{
if (basicList[i].Key > orderedList[c].Key) // The Key of the current object is higher than the key of the current object of the ordered List
{
orderedList.Insert(c, basicList[i]);
objectWasInserted = true;
break;
}
}
if (!objectWasInserted)
{
orderedList.Add(basicList[i]);
}
}
即使这样可行,但速度太慢了。 经过50000个物体的测试,已经需要8秒钟。
LINQ方法OrderBy
要快得多。
orderedList = basicList.OrderByDescending(x => x.Key).ToList();
50000物件仅需7毫秒!
然而,这是一个辅助方法,我想摆脱它,而是使用我自己的算法来按键排序对象列表。
我也尝试过LinkedList而不是普通的List。这有点快,但仍然远离LINQ方法。
有没有办法,加快对象的排序? :)
提前感谢您的帮助!!
答案 0 :(得分:0)
如果你不想使用Linq(这对我来说很奇怪),你可以使用List<T>.Sort
:
basicList.Sort((o1,o2) => o1.Key.CompareTo(o2.Key));
注意:此方法将修改原始列表,而不是创建新列表。
答案 1 :(得分:0)
即使您想使用自己的算法,它也不会像在LINQ OrderByDescending()
方法中实现的算法一样高效和快速。我们不知道在LINQ中使用了哪种排序算法,但我们知道它已经过优化,实现效率高并且使用框架的功能,否则它不需要7毫秒来排序50000个物体。
看看this page,考虑不同的排序算法。
如果您要更改编程语言,则必须使用该编程语言的功能。如果您必须更改编程语言,那么在已经存在的情况下开始实施排序算法对我来说没有意义,这对于您当前使用的语言(如C#)进行了优化。如果您已经知道您将使用哪种语言,那么请考虑语言可以提供的工具来解决您的问题。