问题描述:
一个新的实验要研究N个物体,它们的编号从1~N, 已知N是一个奇数,所有物体的硬度值都未知,且不同的物体的硬度值各不相同。硬度值Y是个自然数。 其中中等硬度物体X,硬度大于X的物体个数和硬度小于X的物体个数相等。
现有一种仪器,只要将三个不同的物体放入仪器,仪器就会检测并返回这三个物体中的中等硬度物体写个程序找出这个中等硬度物体。
1,二分插入:
已知前m个物体硬度的顺序关系。将下一个物体用二分法插入到适当的位置,得出前m+1个物体硬度的顺序关系。以此类推,得出n个物体的顺序关系,从而知道中等硬度者。
2,二分插入 + 剪枝
原理:设 2m +1 = n, 对于一个已全部排好顺序的序列,中等硬度物体左边有m个物体,右边有m个物体,也就是说,若已经知道一个物体所在的序列中位置的左边(右)有m个以上的物体时,则它一定不是所求。所以不用排出它的具体位置,将其插入在最右边(左)即可。
步骤:
先将前m+1个物体排序,第k个物体只有插入在位置k-m-1 到位置 m+1 这个子序列中,才有可能称为中等硬度。若当前插入位置不在上述区域中,则它的具体位置对结果没有任何影响。
当前已将n-1个物体排好序,那么在这n-1个物体中只有最中间的两个物体才有可能为中等硬度,我们称为A,B(A在B的左侧)。
按照上述方法,第n个物体C只需与A,B比较一次:
①若A在中间,则C的插入区域在A的左边,已不在可能区域中,于是将C插入到最左端,最终结果是A。
②若B在中间,同理,将C插入到最右端,结果为C。
③若C在中间,则插入到AB之间,结果为C。
综上,数据结构的选择是为了简化操作,去除不必要的步骤,是算法的基础。而算法的思考宗旨就是充分的利用局部计算信息,整合计算资源,避免重复的计算步骤。