使用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_VALUE
和max = 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数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)