其他地方有关于对 5 件事进行排序的很好的讨论,最多可以进行 7 次比较。
做我想做的事情应该更快,因为我们不关心 3 个最大整数(或 2 个最小整数)的顺序。
背景: 我的程序正在玩 Splendor 游戏,尽可能快地遍历游戏树。就在下面的代码之前,它已经填充了
var GemWeight = new int[5];
决定当前状态下采购的五种有色宝石的重要性的数组(将采购三种权重最高的颜色)。
元素非负且不大于127。
我目前正在使用此 Linq 查找前 3 个整数的数组索引(以及各自的整数):
var ThreeGemsWithIndices =
GemWeight
.Select((TotalWeight, ColorIndex) => new { v=TotalWeight, ColorIndex })
.OrderByDescending(x => x.v)
.Take(3)
.ToArray();
Visual Studio 分析器表示我的程序几乎 20% 的时间都花在这个 Linq 上,因此攻击的时机已经成熟。
找到最大的3个数字最快的C#算法是什么,不一定已排序,如果有平局则任意选择第3个。
例如:从数组 [2,6,10,43,6] 中,我们得到一个数组或三个包含任意顺序的 1,2,3 或 4,2,3 的变量。
[注:欢迎在“前 3 个无序”的要求内加速 Linq 的任何建议,尽管我怀疑它的速度无法与命令式解决方案相匹配。]
这里有两种可能的解决方案
简单排序的代码
public static int[] FindTopThreeValues(int[] array)
{
int first = int.MinValue, second = int.MinValue,
third = int.MinValue;
foreach (int num in array)
{
if (num > first)
{
third = second;
second = first;
first = num;
}
else if (num > second && num != first)
{
third = second;
second = num;
}
else if (num > third && num != second && num != first)
{
third = num;
}
}
return new int[] { first, second, third };
}
使用 LINQ OrderByDescending 进行代码
var distinctValues = array.Distinct().OrderByDescending(x => x).Take(3).ToArray();