从列表中获取新的排序列表,我只需要x个项目,并且不想在获取顶级项目之前对整个列表进行排序

时间:2012-11-26 06:46:00

标签: c# list sorting

我有一个班级

public class Entity : IComparable<Entity>
{

    public float Priority { get; set; }

{

我创建了一个列表,并用没有特定顺序的Y项填充

list <Entity> = get_unorderd_list();

现在我想根据优先级值对列表进行排序,但我只关心以正确的顺序获取最高的X项,出于性能原因我不想使用常规.sort()方法作为X比Y小很多。

我应该编写自定义排序方法吗?或者有办法做到这一点吗?

编辑:不是说通过使用.max()

来创建单个velue

3 个答案:

答案 0 :(得分:3)

  

我应该编写自定义排序方法吗?

我不知道从.NET本身轻松地做到这一点。当我implemented sorting for Edulinq时,我采用了这种方法 - 整个排序是一个快速排序,但我只需要尽可能多的排序,以便返回到目前为止的结果。

现在,这仍然是一种通用的方法 - 如果你事先知道需要多少结果,你可能会做得更好。您可能希望构建一个基于堆的解决方案,其中有一个有界堆(最大大小为X),然后迭代输入,随时向堆中添加值。一旦你填满了第一个X元素,就可以开始丢弃小于最小堆元素的新元素,甚至不用查看树的其余部分。对于其他元素,执行正常操作以插入元素,从而保持堆内的顺序。

有关如何构建堆的详细信息,请参阅Wikipedia article on binary heaps stored as arrays

答案 1 :(得分:1)

如果你的意思是MAX只是使用linq Max找到最高优先级的项目。你不能写出比Max更有效的方法,因为你必须比较列表中的所有项目才能找到最大值。

var highestPeriorityItem = unorderd_list.Max(x=>x.Periority);

编辑:

还有另一种方法比这更有效,即保持列表从一开始就排序。这意味着你必须保持列表与每个插入排序(按排序顺序插入项目)。这样,查找最大项目的时间复杂度为O(1),插入新项目的时间复杂度为O(1) < x < O(N)

希望这会有所帮助。

答案 2 :(得分:1)

麻烦的是你的未排序列表中的最后一项可能是X中的最高项目,所以你必须迭代我应该想到的整个Y.