一、有序表查找
1.折半查找/二分查找算法
(1)基本思想:在顺序存储的有序表中,取中间纪录(a[mid]=key)作为比较对象,若给定值与中间纪录的关键字相等,则查找成功;若给定值小于中间纪录的关键字,则在中间纪录的左半区继续查找;若给定值大于中间纪录的关键字,则在中间纪录的右半边。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。
(2)使用条件:线性表中的纪录是关键码有序的(通常是从小到大有序),线性表必须采用顺序存储,即有序表顺序存储。
(3)算法实现
/*折半查找
* a为线性表数组,n为数据元素总个数,key为要查找的关键值*/
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low=1; //定义最低下标为纪录首位
high=n;
while(low<=high)
{
mid=(low+high)/2; //折半(取整)
if(key<a[mid]) //若查找值比中值小
high=mid-1; //最高下标调整到中位小一伟
else if(key>a[mid]) //若查找值比中值大
low=mid+1; //最低下标调整到中位下标大一位
else
return mid; //若相等则说明Mid即为查找到的位置,返回该位置地址
}
return 0;
}
(4)举例
假设有一有序表a={0,1,16,24,35,47,59,62,73,88,99},n=10,key=62。即除0下标外共10个数字,对它进行查找是否存在62这个数。
a.查找步骤:
第一步:.a[mid]=a[5]=47<key,则low=mid+1=6,此时,mid=(6+10)=8