是否还有其他最佳方法可以从3个排序数组中获取5个最大数字,如下面的代码所示:
更新
下面的代码给出了结果,但我不确定这是否只是这样
输入数组可能包含重复项,但结果不得
高效意味着我们在获得结果时需要更少的迭代。
我正在寻找linq的具体答案。
private void Take5MaxNumbers()
{
var a1 = new[] { 10, 25, 45, 65, 76 };
var a2 = new[] { 32, 43, 54, 62, 78, 85, 93, 102 };
var a3 = new[] { 54, 74, 98, 105 };
var finalArray = a1.Union(a2).Union(a3).OrderByDescending(x => x).Take(5);
foreach (var item in finalArray)
{
Console.Write(item + " ");
}
}
// Output:
105 102 98 93 85
答案 0 :(得分:2)
为3个数组迭代5个合并排序步骤:这可以通过包含每个数组的最大值的三个元素的数组来完成,然后找到最大值的最大值和索引。 (如果索引是2(从0..2开始),则从最后一个预先排序的数组中替换该元素。)
使用linq [高效]执行此操作的步骤可能需要执行以下步骤 -
答案 1 :(得分:1)
从排序数组中找出前5个元素的最佳方法是比较每个数组的最后一个元素get max和每个数组的比较最后一个元素,留下前一个已创建的元素。
下面是执行此任务的两种方式,第一种是仅使用基本类型,并且是最有效的方式,没有额外的循环没有额外的比较没有额外的内存消耗,只需传递需要与另一个匹配的元素的索引一,并计算哪个是每个给定数组匹配的下一个索引。
第一拳是:通过链接: -
Most efficient way to find max top 5 number from three given sorted array
第二个是: -
int[] Array1 = { 09, 65, 87, 89, 888 };
int[] Array2 = { 1, 13, 33, 49, 921 };
int[] Array3 = { 22, 44, 66, 88, 110 };
int [] MergeArr = Array1.Concat(Array2).Concat(Array3).ToArray();
Array.Sort(MergeArr);
int [] Top5Number = MergeArr.Reverse().Take(5).ToArray()
答案 2 :(得分:0)
您可以获取每个数组中的前5个元素,然后通过降序排序。
var a1_5 = a1.Reverse().Take(5).Reverse();
var a2_5 = a2.Reverse().Take(5).Reverse();
var a3_5 = a3.Reverse().Take(5).Reverse();
var resultArray = (a1_5.Union(a2_5)).Union(a3_5).OrderByDescending(x=>x).Take(5);
这样您的排序方法“OrderByDescending”将有更少的输入处理和更好的性能。