编程之美-2.10-寻找数组中的最大值和最小值
1. 简述
对于一个由N个正数组成的数组,需要比较多少次才能把最大值和最小值找出来?
2. 思路
1) 就是遍历一遍,分别统计最大值和最小值,2*N。
2) 每次遍历两个数字,比较一下这两个数字,大的数字更新最大值,小的数字更新最小值,一共是N/2次,每次比较3次,一共就是3*N/2次比较。
扩展问题就是求N个元素的数组中第二大的数,需要比较的次数,以及是否可以是使用类似的分治思想降低比较次数。感觉有点像Top-2,每次先与次大的比,如果大于次大的,更新次大的,然后与最大的比,如果大于最大的,更新最大的。次数可以这样算,每个数大于最大的,小于次大的,以及介于两者之间的可能性假设相同,那么次数的期望就是1/3 * (2 + 1 + 2) = 5 / 3,要比3/2更大一些。另外,如果假设每个数大于次大的和小于次大的可能性相同,那么次数的期望就是1/2 * (2 + 1) = 3 / 2。
3. 参考
编程之美,2.10节,寻找数组中的最大值和最小值。
编程之美》2.10 寻找数组中的最大值和最小值