当你只想要最好的时候,高效的排序

本文关键字:高效 排序 当你 只想 | 更新日期: 2023-09-27 18:15:57

我有一个5000项的list,使用自定义算法进行排序。
排序完成后,我只需要最好的一个,即list[0]

所以我需要一个算法,取列表的第一项,与第二项比较,然后将这两项中较好的一项与第三项进行比较,等等。只需对整个列表进行一次循环(o (n))。

对于这种常见的场景,我应该使用c#中的哪种排序方法?
我认为我目前使用的Sort(..)算法对于这个目的是非常低效的。

当你只想要最好的时候,高效的排序

您可以使用MoreLINQ's MaxBy()
根据你如何定义"best",你指定的选择器参数可能会有所不同。

示例:你有一个字符串列表,"最佳值"是最长的字符串。

string longestString = listOfStrings.MaxBy(x => x.Length);

从链接的实现中可以看到,这是O(n)

我发现MoreLinq的MaxBy与选择,投影,源和键有点太复杂,只是使用我自己的代码作为扩展方法:

    public static T GetBest<T>(this List<T> list, IComparer<T> comparer)
    {
        if (list == null) throw new ArgumentNullException("list");
        if (comparer == null) throw new ArgumentNullException("comparer");
        if (list.Count > 0)
        {
            T best = list[0];
            for (int i = 1; i < list.Count; i++)
            {
                if (comparer.Compare(best, list[i]) > 0)
                {
                    best = list[i];
                }
            }
            return best;
        }
        return default(T);
    }