1.用折半查找的必须是有序的(即已经排好序的)
2.优点:比较次数少,查找速度块
3.缺点:要求待查表为有序表,而且插入困难
4.适用于 不经常变动而且要频繁查找的有序表
折半查找可以用2种方法实现,分别是 循环 和 递归。
#include<stdio.h>
/*-----------循环实现二分法-------------------*/
int binarysearch(int a[],int key,int len)
{
int middle;
int low = 0;
int high = len-1;
while(low<=high)
{
middle = (low+high)/2;
if(a[middle]==key)
return middle;
if(a[middle]>key)
high = middle-1;
if(a[middle]<key)
low = middle+1;
}
return -1;
}
/*------------------------------------------*/
int main()
{
int arr[]={1,2,12,21,45,65};
int re;
re = binarysearch(arr,21,sizeof(arr)/sizeof(int));
printf("%d",re); //打印结果:3 (返回的是key在数组中的位置)
return 0;
}
下图的是递归方法,个人不推荐用递归因为传递的参数比较多且理解起来没while循环容易
#include<stdio.h>
int binarysearch(int a[],int key,int low,int high)
{
int middle;
// printf("low=%d,high=%d\n",low,high);
middle = (low+high)/2;
// printf("middle=%d\n",middle);
// printf("a[middle]=%d\n",a[middle]);
if(a[middle]==key)
{
// printf("OK\n");
return middle;
}
if(middle == low||middle == high)
{
if(a[low]==key)
return low;
if(a[high]==key)
return high;
else
// printf("return -1\n");
return -1;
}
if(a[middle]>key)
{
// printf("a[middle]>key\n");
return binarysearch(a,key,low,middle);
}
if(a[middle]<key)
{
// printf("a[middle]<key\n");
return binarysearch(a,key,middle,high);
}
}
int main()
{
int a[]={0,11,23,34,44,59};
int b=binarysearch(a,34,0,5);
printf("b=%d\n",b);
return 0;
}