从排序数组中选择最多5个数字的有效方法

时间:2013-03-04 06:06:55

标签: c# linq

是否还有其他最佳方法可以从3个排序数组中获取5个最大数字,如下面的代码所示:

更新

  1. 下面的代码给出了结果,但我不确定这是否只是这样

  2. 输入数组可能包含重复项,但结果不得

  3. 高效意味着我们在获得结果时需要更少的迭代。

  4. 我正在寻找linq的具体答案。

  5. 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
    

3 个答案:

答案 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() 

Most efficient way to find max top 5 number from three given sorted array

答案 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”将有更少的输入处理和更好的性能。