二分查找
1.1顺序查找基本思路:从表的一端开始顺序扫描,直到找到k值或者查找失败。
2.1二分法查找要求线性表是有序表,即表中节点关键字必须有序,并且要用向量作为表的存储结构。
2.2二分查找的基本思路
(1)确定该区间的中点:Mid=[(hight+low)/2];
(2)待查找的k值与R[mid].key比较,若相等则,查找成功;否则继续确定新的区间...
假如R[mid].key>k,确定新区间在low至mid之间,新的high=mid-1;
假如R[mid].key<k,确定新区间在mid至high之间,新的low=mid+1;
(3)依次进行直到找到k值或者查找失败,结束算法。
(4)如图所示(二分查找数据58):
2.3二分法查找算法
#include<stdio.h>
#define keytype int
typedef struct{
keytype key;
}tablekeytype;
int binserach(sqlist *r,int n,keytype k)
{
int mid,high=n-1,low=0;
if(r[low].key=k)
{
return low;
}
if(r[high].key=k)
{
return high;
}
while(low<high)
{
mid=low+((high-1ow)/2);
//使用(low + high)/2会有溢出问题
// (low+high)/2结果大于表达式结果所能表示的最大值
//产生溢出后在除2不会产生正确结果,low+((high-1ow)/2)不会产生这样的问题
if(r[mid].key==k)
{
return mid;
}
elseif(r[mid].key>k)
{
high=mid-1;
}
else
low=mid+1;
}
if(low>high)
return error;
}
2.4描述二分查找的判定树
判定树是内部节点的总数为n=2的h次方,树的深度为h=[log2(n+1)]-1的满二叉树,第k层的节点数为2的k-1次方,查找所需要的比较次数为k次。ASL=log2(n+1)-1,最坏情况下,比较次数为[log2(n+1)]