有没有一种方法可以有效地比较每个数组的值?

时间:2020-06-02 14:55:43

标签: c# algorithm methods

因此,我一直试图将数组中给定的双精度值相互比较以返回最小的值,但是我这样做的方法似乎并不一致且非常有效。我感到失落。

file: {
fileName:xyz,
size:7125,
mimeType:document/pdf
}

3 个答案:

答案 0 :(得分:3)

如果您愿意使用System.Linq(在给定的答案的情况下,您似乎愿意使用),那么您也可以直接使用Min()方法:

public static double FindSmallestNum(double[] arr)
{
    return arr.Min();
}

尽管考虑到这是一个简单的单行方法调用,但尚不清楚在这种情况下辅助方法是否真的有用。


您的代码有问题

在示例代码中,问题似乎在于您设置了max = 0;(为什么将其命名为max而不是min?)然后开始进行比较以查看是否max大于数组中的项目。这可能会造成问题,因为所有正数都将大于max,因此将永远不会考虑它们。

要解决此问题,首先让我们将该变量重命名为min,以便我们记住我们在做什么,然后将其设置为数组中的第一个值。这样我们就知道我们正在处理数组中的数字,并且所有比较都是有效的。

接下来,我们不需要将每个项目与下一个项目进行比较-这种比较与查找所有项目中的最小项目无关。我们只需将每个项目与min的当前值进行比较(如果发现较低的数字,则进行必要的重新分配)。

这将使代码减少为:

public static double FindSmallestNum(double[] input)
{
    if (input == null) throw new ArgumentNullException(nameof(input));
    if (input.Length == 0) 
        throw new InvalidOperationException("array contains no elements");

    // Start with the first number
    double smallest = input[0];

    // Now compare the rest of the items with 'smallest'
    for (int index = 1; index < input.Length; index++)
    {
        if (input[index] < smallest) smallest = input[index];
    }

    return smallest;
}

答案 1 :(得分:0)

您的代码可以进一步优化。您可以看到以下逻辑。该代码的复杂度为O(N)

static void GetSmallest(int[] arr)
{
    int first, arr_size = arr.Length;

    first = int.MaxValue;

    for (int i = 0; i < arr_size; i++)
    {
        if (arr[i] < first)
        {
            first = arr[i];
        }
    }
}

您也可以使用以下代码。

int[] arr = new int[5] { 1, 2, 3, 4, 5 };
int min = arr.Min();

答案 2 :(得分:-1)

只需使用Linq:

var min = arr.OrderBy(v => v).FirstOrDefault();

min将是数组中最小的数字。