1

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

更新:

  1. 下面的代码给了我结果,但我不确定这是否是唯一的方法

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

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

  4. 我正在寻找 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
4

3 回答 3

2

对 3 个数组迭代 5 步合并排序:这可以通过一个包含三个元素的数组来完成,该数组包含每个数组的最大值,然后找到最大值和最大值的索引。(如果索引为 2(从 0..2 开始),则从最后一个预排序数组中替换该元素。)

使用 linq [有效地] 执行此操作的步骤可能需要这些步骤 -

于 2013-03-04T06:12:56.393 回答
1

从排序数组中找出前 5 个元素的最佳方法是比较每个数组的最后一个元素获取最大值,并比较每个数组的最后一个元素留下前一个创建的元素。

下面是执行此任务的两种方法,第一种是仅使用基本类型并且是最有效的方法,没有额外的循环没有额外的比较没有额外的内存消耗,只需传递需要与另一个匹配的元素的索引并计算这是每个给定数组要匹配的下一个索引。

第一个是这样的:通过链接:-

从三个给定的排序数组中找到最大前 5 个数字的最有效方法

第二个是这样的:-

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

从三个给定的排序数组中找到最大前 5 个数字的最有效方法

于 2013-09-13T09:26:59.083 回答
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”将有更少的处理输入和更好的性能。

于 2013-03-04T06:45:34.953 回答