算法导论9.1 最大值和最小值

来源:互联网 发布:淘宝推广管理在哪 编辑:程序博客网 时间:2024/05/08 20:52

情景:对于一个数组,同时求出其最大值和最小值。

分析:

  • 方法1:
将最大值和最小值设置为第一个元素,依次比较剩下的元素,需要比较 2 (n - 1) 次;
  • 方法2
主要思路为成对比较。
取出相邻两个元素,比较大小,然后将较小值和最小值比较,将较大值和最大值比较,如此一对元素需要进行三次比较。
最大值和最小值的初始化和数组长度奇偶相关:如果数组长度为奇数,将最大值和最小值设置为第一个元素,然后从第二个元素起,成对的进行比较;
如果数组长度为偶数,首先对第一对元素进行比较,将最大值初始化为较大值,最小值初始化为较小值,然后从第三个元素起,成对的进行比较。

代码:
import java.util.ArrayList;public class MaxAndMinDemo {public static int bruteForce(ArrayList<Integer> list) {int maxVal = list.get(0);int minVal = list.get(0);int times = 0;for (int i = 1; i < list.size(); i++) {if (list.get(i) >= maxVal) {maxVal = list.get(i);times++;} else {times++;}if (list.get(i) <= minVal) {minVal = list.get(i);times++;} else {times++;}}return times;}public static int mathod(ArrayList<Integer> list) {int maxVal = 0;int minVal = 0;int times = 0;if (list.size() % 2 == 0) {if (list.get(0) > list.get(1) ) {maxVal = list.get(0);minVal = list.get(1);} else {maxVal = list.get(1);minVal = list.get(0);}times++;for (int i = 2; i < list.size() - 1; i = i + 2) {if (list.get(i) > list.get(i + 1)) {maxVal = Math.max(maxVal, list.get(i));times++;minVal = Math.min(minVal, list.get(i + 1));times++;} else {maxVal = Math.max(maxVal, list.get(i + 1));times++;minVal = Math.min(minVal, list.get(i));times++;}times++;}} else {maxVal = list.get(0);minVal = list.get(0);for (int i = 1; i < list.size() - 1; i = i + 2) {if (list.get(i) > list.get(i + 1)) {maxVal = Math.max(maxVal, list.get(i));times++;minVal = Math.min(minVal, list.get(i + 1));times++;} else {maxVal = Math.max(maxVal, list.get(i + 1));times++;minVal = Math.min(minVal, list.get(i));times++;}times++;}}return times;}public static void main(String[] args) {// TODO Auto-generated method stubArrayList<Integer> list = new ArrayList<Integer>();for (int j = 100001; j > 0; j--) {list.add(j);}System.out.println(bruteForce(list));System.out.println(mathod(list));}}

结果:

200000
150000


利用方法二,可以减少四分之一的比较次数,很屌。。。

阅读全文
0 0