一、题目
证明:在最坏情况下,利用n+ceil(lgn)-2次比较,即可得到n个元素中的第2小元素。(提示:同时找最小元素)
二、算法过程
step1:对所有元素,两个一组比较大小,小的一个进入下一轮比较。一直到比较出最小的元素。此时所有比较结果构成一棵二叉树。比较次数为n-1。
![](https://img-my.csdn.net/uploads/201209/16/1347765718_1302.gif)
step2:沿着树从树根向下到叶子,找出第二小的元素,比较次数是ceil[lgn]-1。令m2[p]表示以p为根的树中的第二小元素。对于当前处理结点为p,key[p] = min{key[left[p]], key[right[p]]}。假设key[p] = key[left[p]],则m2[p] = min{m2[left[p]], key[right[p]]}
![](https://img-my.csdn.net/uploads/201209/16/1347765776_8709.gif)
三、思考过程
1.根据提示,需要同时找最小元素,找最小元素的比较次数至少为n-1
2.在找次小元素时,尽量使用step1所产生的附加信息
3.次小值一定是在step1中与最小元素直接比较的过程中被淘汰的那些数(仔细想一下为什么)
4.若“step1中与最小元素直接比较的过程中被淘汰的数”的个数为m,找次小值的比较次数为m-1
5.常规方法中,最坏情况下,m = n-1
6.调整算法,使最坏情况下m = ceil[lgn]
7.最终算法比较次数 = (n-1) + (m-1) = n + ceil[lgn] - 2