中等硬度问题

来源:互联网 发布:java需求分析文档 编辑:程序博客网 时间:2024/05/02 01:44

有N个物体,编号1~N,已知N为奇数,所有物体硬度未知且各不相同。现在要找硬度值为中位数的这个物体。

只提供一个比较方法:Med3,这个方法将三个不同物体编号作为参数,返回三者中间硬度的编号。

 

方法1:每次将三个物体进行比较,用a和b代表此次比较非中间硬度的两个物体的编号,并持续将后边的物体加入比较,最后可知a和b必然不是中间硬度物体,可以除去。每次这样的操作可以去除两个物体,进行N-2次即找到答案,复杂度是O(n2)。

 

方法2:取a1和a2作为基准,将所有其余物体与a1,a2比较,分为三类:a1左边、中间、a2右边。答案只能是a1、a2或者三类之一,然后递归在子分类中进行查找即可。注意如果确定是在a1左边这个类,需要把a2传下去来确定子类中的左右顺序。复杂度是O(nlogn)。

原创粉丝点击