假如我们对5元组中的元素进行排序,我们只需要7次比较,就可保证把5元组排好序。详见我的博文http://blog.youkuaiyun.com/gningh/article/details/7341403
当我们只想找到中间元,不想对其排序时,我们要多少次比较?其实我们最多只需6次比较就可以得到!(次数太少了点吧?,我想了很久,想出来个错的!)
下面是从网络中搜的解决方法,原文见文章末尾的链接
方法一:设5个数为a,b,c,d,e
先取a、b进行比较, c、d进行比较,假设a>b、c>d(两次比较)。
对a、c进行比较 假设a>c(1次比较)
那么可以得出a不可能是中位数,因为a>c>d a>b
所以现在就是在 b,c,d,e中求一个次大的,且有条件c>d
将b和e进行比较,假设b>e(1次比较)
此时有 b>e 与 c>d
已经进行了四次比较,
将b,c进行比较 假设b>c(1次比较)
那么有 b>c>d
在将e与c进行比较 e,c中的较大值变为次大的。
方法二较难看懂:
5个数之间的大小关系构成的一个树形图T。T中的一个结点代表一个数,而一条边代表它所关联的两个数的大小关系,T的根就是中位数。显然T中的一条边要由一次比赛来确定。在下面的图中,如果x大于y,则节点x在节点y的上方且x和y有一条边相连。另外,*表示一般的数,o表示下一次即将进行比较的两个数。
第1步,先任取两个数比较,结果为:
*
|
* o o *
第2步,再取另外两个数比较,结果为:
o o
| |
* * *
第3步,按照上图比较其中两个标记为o的数,比较结果只有一种情况:
*
/ \
* o
|
* o
第4步,按照上图比较其中两个标记为o的数,比较结果有两种情况:
* o *
/ \ / / \
o * o o
| | |
* * *
第5步,按照上图比较其中两个标记为o的数,比较结果有两种情况:
* * *
/ \ / \ /
/ \/ \ /
| /\ | /
| / \ | *
| / \ | | \
|/ \| | \
o o | \
| o o
| |
| |
* *
第6步,按照上图比较其中两个标记为o的数,比较结果有两种情况:
* * * * * *
\ / \ / | |
x x * *
| / \ | |
* * * x x
| | / \
* * * *
|
*
其中的x就是中位数。
事实上,可以证明:对于n个数求中位数,至少需要3(n-1)/2次比较,并且存在一个O(n)次比较的算法。
参考文献:http://louxinyue.iteye.com/blog/812696
http://bbs.youkuaiyun.com/topics/210087033