二分查找主要是面对有序数据进行高效查找的方法,又称为折半查找,但是二分查找适合于内存连续的数据结构,因此当数据量太大时则不太适合二分查找,因其占用的内存太大。因为其查找速度快因此其时间复杂度为O(log n)
其查找方法只需有三步: 在一个一维数组arr[]中,查找元素key,数组长度为length
(1)先比较key是否和arr[(length-1)/2]相等,若相等则返回下标
(2)若小于arr[(length-1)/2]则在数组的左半部分查找,继续进行
(3)若大于arr[(length-1)/2]则在数组的右半部分查找,继续进行
int Mid_Search(int arr[],int left,int right,int key)
{
while(left<=right)
{
int mid=left+(right-left)/2;
if(key<arr[mid])
{
right=mid-1;
}
else if(key>arr[mid])
{
left=mid+1;
}else
{
return mid;
}
}
return -1;
}
测试用例:
int main()
{
int arr[]={1,2,3,4,5,6,7,8,9,10};
int key=3;
int length=sizeof(arr)/sizeof(arr[0]);
int a = Mid_Search(arr,0,length-1,key);
if(a != -1)
{
printf("%d",a);
}
else
{
printf("cannot find it!");
}
return 0;
}
测试显示:key=3时 返回mid=2; key=11时,打印cannot find it !