2.3.19附加题:找到一种对于任意输入都只需要少于7次比较的五取样算法。
答:设有5个数,a,b,c,d,e,若这5个数有序,那么中位数为c,c的特点是它只大于两个数。
设a,b,c,d,e为任意排列情况,按下面的步骤可以在6次比较时得到中位数
1)用d与e比较,当d>e时,交换d,e得到d<e。
2) 用b与c比较,当b>c时,交换b,c得到b<c。
3) 用c与e比较,当c>e时,交换c,e得到c<e,此时有d<e,b<c<e,由于中位数只大于两个数,这里的e大于了3个数,那么e不是中位数。
4)用a与d比较,当a>d时,交换a,d得到a<d。
此时有a<d,b<c。
5) 用c与d比较,当c>d时,交换c,d得到c<d,此时的b<c<d ,a<d,由于中位数只大于两个数,这里的d大于了3个数,那么d不是中位数。
此时有b<c。
6)用a与c比较,当a>c时,交换a,c得到a<c,此时的a<c,b<c,由于中位数中只大于两个数,这里的c刚好只大于两个数,那么c就是中位数。