算法导论9-1
读书笔记
本小节介绍了两点:
- 如何找到数组中的最大值和最小值?
- 如何同时找到数组中的最大值和最小值?
找到最小值
最小值和最大值的方法是一致,从数组中取出一个值,然后和其他的\(n-1\)个值相比较,不断更新最大值/最小值,经过\(n-1\)次比较,可以获得最大值/最小值。
同时找到最大值和最小值
如果没有同时这个条件的话,可以独立地求出这两个值,总计需要\(2n-2\)次比较。
但是有一种更优的方法来同时获得最大值和最小值。
- 从待比较数组中选取两个元素\(a,b\);
- 然后这两个元素进行比较,选出较大值和较小值;
- 然后较大值和当前最大值比较获得新的最大值,较小值和当前较小值比较获得新的最小值;
一次循环中比较了\(3\)次,一共有\(\lfloor n/2 \rfloor\)次循环,所以一共比较了\(3\lfloor n/2 \rfloor\)次。
如何选取初始的最大值和最小值?
如果元素个数为奇数,初始最大值和最小值为数组的第一个元素;
如果元素个数为偶数,先对数组的前两个元素进行比较,然后较小值作为初始最小值,较大值作为初始最大值;
课后习题
9.1-1
证明:在最坏情况下,找到\(n\)个元素中第二小的元素需要\(n+\lceil \lg{n} \rceil -2\)次比较。(提示:可以同时找最小元素。)
思路请参考这里。
代码请参考这里。
9.1-2
证明:在最坏情况下,同时找到\(n\)个元素中最大值和最小值的比较次数是\(\lceil 3n/2 \rceil -2\)。(提示:考虑有多少个数有成为最大值或最小值的潜在可能,然后分析一下每一次比较会如何影响这些计数。)
略。