使用Java中的数组更好的最小和最大算法

Posted

技术标签:

【中文标题】使用Java中的数组更好的最小和最大算法【英文标题】:Better minimum and maximum algorithm using an array in Java 【发布时间】:2012-10-20 11:20:08 【问题描述】:

我试图写一个简单的 max 和 min 方法,当我写它时,我不禁觉得它不应该这么复杂......也许我错了? 我的最大代码是这样工作的,请原谅我糟糕的伪代码:

用 10 个随机数填充一个数组。 创建一个初始化为 0 的最大变量,因为 0 是最低的最大值。 将每个元素与最大值进行比较 如果元素大于 max,则将 max 的值替换为有问题的元素

我不喜欢必须将 max 初始化为 0 的事实,我觉得可能有比这更好的方法吗?

我的最小代码的工作方式类似,除了我: 比较我的最小值低于数组元素。 如果元素较低,则替换最小值。

我真正不喜欢的是我必须将 min 初始化为最大随机数,在本例中为 50。

我的问题是: 有一个更好的方法吗? 有没有更高效的方法来编写这段代码?

import java.util.Random;

public class Main 

public static void main(String[] args) 

    //Declare min and max
    int max=0;
    int min;
    //Array of 10 spaces
    int[] ar=new int[10];
    //fill an array with random numbers between 0 and 50

    for(int i=0;i<10;i++)
    
        ar[i]=new Random().nextInt(50);
    

    //Test max algorithm
    //loop trough elements in array
    for(int i=0;i<10;i++)
    
        //max is set to 0, there should always be a maximum of 0
        //If there isnt 0 will be the maximum

        //If element is greater then max
        //replace max with that element
        if(ar[i]>max)
        
            max=ar[i];
        
    
    System.out.println("The max is "+ max);

    //Test min
    //Initialising min to maximum Random number possible?
    min=50;
    for(int i=0;i<10;i++)
    
        if(ar[i]<min)
            min=ar[i];
        
    
    System.out.println("The min is "+min);



【问题讨论】:

您可以使用Arrays.sort(ar) 对数组进行排序,然后取第一个和最后一个元素。 您可以先将最大和最小计算分组在同一个循环中。 排序会慢一些:O(n log(n)) vs O(n) for the min/max loop。 【参考方案1】:

您始终可以获取数组的第一个元素(即numbers[0])作为初始值并从第二个元素开始循环。

int[] numbers = new int[10];
int max, min;
...
min = max = numbers[0];
for(int i = 1; i < numbers.length; ++i) 
    min = Math.min(min, numbers[i]);
    max = Math.max(max, numbers[i]);

【讨论】:

除非数组为空。我更喜欢以min = Integer.MAX_VALUEmax = Integer.MIN_VALUE 开头。 @PhilippReichart 如果数组为空,则该空数组的最大值为Integer.MIN_VALUE?这对我来说听起来不对;)我要么添加一个可自定义但强制的默认值,要么引发异常。【参考方案2】:

好的,虽然其他人已经发布了答案,但我已经花时间将您的代码编辑成我认为更有用的东西。

    制作静态方法。这些可以重复使用。 使用省略号 (...),因为这样您既可以像在代码中一样调用数组参数的方法,也可以使用可变数量的参数作为 min(5,3,8,4,1)。 使用数据类型提供的最小/最大可能数字进行初始化 要检查您的代码是否有效,您必须先打印出数组中的项目,因为当您不知道其中的内容时,就无法判断结果是否正确。 将您的代码基于标准库中的现有方法,因为众所周知,这些方法已经过全面测试并且工作效率高(我知道,min/max 看起来像一个过于琐碎的示例)。 除非您真的可以证明您的代码中存在性能问题,否则我不会过多地担心性能问题。优先级应该更像是第一正确性、第二可读性/可维护性、第三性能。

其他人已经提到了大部分,但无论如何,这是代码:

import java.util.Random;

public class MinMax 

    public static int min(int... args) 
        int m = Integer.MAX_VALUE;
        for (int a : args) 
            m = Math.min(m, a);
        
        return m;
    

    public static int max(int... args) 
        int m = Integer.MIN_VALUE;
        for (int a : args) 
            m = Math.max(m, a);
        
        return m;
    

    public static void main(String[] args) 

        // fill an array with random numbers between 0 and 50
        int[] ar = new int[10];
        for (int i = 0; i < 10; i++)
        
            ar[i] = new Random().nextInt(50);
            System.out.println(ar[i]);
        

        int maxValue = max(ar);
        int minValue = min(ar);

        System.out.println("The max is " + maxValue);
        System.out.println("The min is " + minValue);
    

【讨论】:

谢谢,我知道在这种情况下性能并不那么重要。这对我自己来说更重要的是构建一个更好的算法。 一句话要检查您的代码是否有效,您必须打印出项目 - 更多最好是编写简单的单元测试。 @dantuch:是的,这绝对是真的。 @Axel 我认为更好的方法是将数组的第一个数字指定为最大值或最小值,而不是惊慌地寻找该数据类型的最大值或最小值。 @AmanDeepGautam,不。他这样做的方式更惯用/更清晰。【参考方案3】:

小贴士:

    用第一个元素初始化min,并从第二个开始:

    int min = ar[0];
    for(int i=1;i<10;i++)
    

    ...或从:

    int min = Integer.MAX_VALUE;
    

    如果您希望您的数组可以是空的,这种方法会更好。

    使用Math.min 来避免显式条件(有些人可能会说它比较慢):

    for(int i=0;i<10;i++)
    
       min = Math.min(min, ar[i]);
    
    

【讨论】:

【参考方案4】:

当数字改变时,将最大值初始化为 0 和最小值为 50 将不起作用。更合适的方式是: 1.将它们初始化为数组的第一个元素。 2. 使用length 代替常量。

max = ar[0];  
    for(i=0;i<ar.length; i++)  
      
            if(ar[i]>max)  
              
                max=ar[i];  
              
    

最小值相同:

min = ar[0];
for(i=0;i<ar.length; i++)

        if(ar[i]<min)
        
            min=ar[i];
        

【讨论】:

【参考方案5】:
public static void main(String[] args) 
     int[] myArray = 9, 7,9, -40, -10, 40;
    //int[] myArray = ;
    //int[] myArray = 4;
    System.out.println("Difference between max and min = "
            + findDifference(myArray));


// Find difference between Max and Min values for a given array
public static int findDifference(int[] arr) 

    if (arr.length == 0) 
        // Log
        System.out.println("Input Array is empty");

        return Integer.MIN_VALUE;
    

    int min = arr[0];
    int max = arr[0];

    for (int i = 1; i < arr.length; i++) 
        if (arr[i] < min)
            min = arr[i];
        else if (arr[i] > max)
            max = arr[i];
        // Just to check if logic works fine
        System.out.println("Min=" + min + " Max=" + max);
    

    return max - min;


【讨论】:

【参考方案6】:
import java.io.*;

public class MultiDimensionalArrayIO 

public static void main(String[] args)throws IOException 
BufferedReader c= new BufferedReader (new InputStreamReader (System.in) );

System.out.print ( "Enter Number Column : " );
int column = Integer.parseInt(c.readLine());
System.out.print ( "Enter Number Row : " );
int row = Integer.parseInt(c.readLine());

int array [][] = new int [column][row];
int max = array [0][0];
int min = array [0][0];
int sum= 0;
for ( int i=0 ; i < array.length; i++)   
for (int j=0 ; j<array[i].length; j++)
    System.out.print("Enter Array Values ["+i+"]["+j+"]: " );
    array[i][j]= Integer.parseInt (c.readLine()); 

        min = Math.min(min , array[i][j]);
        max = Math.max(max , array[i][j]);
        sum += array[i][j];
    


    System.out.println("The Min Number :"+ min);
    System.out.println("The Max Number :"+ max+ " total is "+ sum);



【讨论】:

【参考方案7】:

根据您是否希望在同一方法中使用 max 和 min 函数,您还必须考虑返回类型。

到目前为止,大多数建议都将两者分开,这意味着可以返回一个 int。但是,如果将 max 和 min 函数放入 findLargestDifference 方法中,则必须返回 long 查看,因为 int 数组中任何给定数字之间的最大差异可能是 2 个 int 的大小。您还不必在 int 数组上循环两次。

此外,我建议为角落和边缘情况编写单元测试,而不是在主方法中打印。它有助于在实现时尽早测试您的逻辑,因此通常会使代码更简洁。

参见下面的示例代码。

public class LargestDifference 

public static long find(int[] numbers) 
    if (numbers == null || numbers.length == 0) 
        throw new IllegalArgumentException("Input cannot be null or empty.");
    else 
        long currentMax = numbers[0];
        long currentMin = numbers[0];

        for (int i=0; i < numbers.length; i++) 
            if (currentMin > numbers[i]) 
                currentMin = numbers[i];
            else if (currentMax < numbers[i]) 
                currentMax = numbers[i];
            
        
        return currentMax - currentMin;
    

【讨论】:

以上是关于使用Java中的数组更好的最小和最大算法的主要内容,如果未能解决你的问题,请参考以下文章

java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)

java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)

求出100个数组里的最大的前十个数最快的算法,c++

给定的数组任意取出三个数(要求全部取到且不能重复)求和,找出和中最小值 Java 说说思路或者算法就

算法拾遗最大数和最小数

元素中最大距离的算法