C语言二分法查找

Python012

C语言二分法查找,第1张

#include <stdio.h>//不用math头文件

void main()

{int high = 9,low = 0,m,k,a[10]={1,2,3,4,5,6,7,8,9,10}//hing和low赋初值

scanf("%d",&k)

while (high>=low)//>=

{

m=(high+low)/2

if(k<a[m]) high=m-1//比较的是数值而不是下标

else if(k>a[m]) low=m+1

else

{

printf("yes")

return//这两句地方放错了

}

}

printf("no")

return//if语句去掉

}

  对具有n个元素的有序数组进行二分法查找,要分析的比较次数,可以使用画二叉判定树的方法来分析。该二叉判定树的高度为[log2(n)]+1层,此即为二分查找的最多比较次数,比如:n=1000,则最多比较[log2(1000)]+1=9+1=10次。

  如果要计算平均的比较次数,则需要对二叉判定树中的每个节点进行分析,处于第一层的比较1次,第二层的比较2次,第三层比较3次,依次类推……把各个节点的比较次数累加,再处于节点数(元素个数)即为平均比较次数,这里假设查找是在等概率的情况下进行的。

  举个例子:有9个元素的有序数组,对每个元素按1,2,3...8,9进行编号,则其二叉判定树如下:

图中可以看出,如果要找的元素处在第5个位置,则只要1次比较即可找到,若找第9个元素,则需要4次比较,算法分别比较了第5,7,8,9等4个元素。所以,平均的比较次数大概如下:

这样分析,能看懂吗?希望能帮到你!

最坏的情况应该是log2n向下取整+1,这也是折半查找判定树(完全二叉树)的树高。

第一,题目不严谨,这个折半查找可以向上或向下取整(大部分参考书上默认用向下取整来讲解),向下取整当然是花4次找到8,而向上取整是3次。

第二,最后剩下一个数的时候,那个数还需不需要比较,从代码层面来看,不能简单认为最后剩下的一个数就是所找的数,因为那个数可能并不在序列中,所以最后一次也应该比较。折半查找判定树也是这么定义的,所查找数字所在层的树高即比较次数。

至于那个结论,最坏情况下需要比较的次数,是一个等价无穷小的结论而已。因为比较次数是一个整数,结果可能是个小数,如果那个是最坏比较次数的具体答案的话,它还会指明它是向上取整还是向下取整。