public class 找出一个数组中第二大的数 {
public static int find(int[] arr) {
int max1 = arr[0];
int max2 =arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > max1) {
max2 = max1;
max1 = arr[i];
} else if (arr[i] > max2 && arr[i] < max1) {
max2 = arr[i];
}
}
return max2;
}
public static void main(String[] args) {
int[] arr = { 2, 89, 9, 5, 3, 5, 89, -1 };
int a = find(arr);
System.out.println(a);
}
}
首先设置两个索引max1,max2,分别用来存最大的和次最大的索引。然后遍历一次,当a[i] > a[max1]时是一种情况,要进行交换;另外当a[i] < a[max1] 同时a[i] > a[max2]时,这种情况也要进行处理。注意,max1、max2的索引初值均为0, 有的人把max2设成-1,这是不够严密的。另外,就是遍历的时候,从第二个数开始遍历即可,即i = 1开始往后遍历。
这个算法的复杂度是o(n),问题似乎很好解决了,但试问有比这更快的方法吗?而且,如果不是让找第二大的数,而是找第三大、第四大、第五大,或者第三小、第4小的数,上面这种思路显然是走不通的。肿么办? 下篇接着说。