算法-查找之二二分查找
顺序查找【算法-查找之一】顺序查找是最简单的查找策略,易于分析,适用于小规模数据。如果数据规模很大时,顺序查找的表现就不尽人意,此时需要寻找一个更有效率的算法-二分查找。
二分查找,也称折半查找,查找性能优异,但查找数据必须是有序序列。
1.顺序查找:
核心:先确定待查目标所在的范围,然后逐步缩小范围直到查找成功或查找失败。
关键字key与表中某一元素Array[i]比较,有3中结果:
1.key==Array[i],查找成功。
2.key > Array[i],待查元素可能的范围是Array[i]之前。
3.key < Array[i],待查元素可能的范围是Array[i]之后。
二分查找基于上述的原理:每次将可能范围中间位置的数与key比较,相等则放回查找成功,不等则缩小范围。如下图:
关键字与当前范围中间位置元素比较:
关键字>中间位置元素,则缩小后的范围:中间元素右边
通过不断地缩小查找范围,知道查找成功,或者返回查找失败。
示例 程序如下:
#include
int BinarySearch(int Array[],int key,int n)
{
int left=0; //记录范围左边界
int right=n-1; //记录范围右边界
int mid;
while(left<=right) //范围是否不为空
{
mid=(left+right)/2; //取当前范围中间位置
if(key
Array[mid])
{
left=mid+1; //大于,左边界上移
}
else
{
return mid; //等于,查找成功,返回元素位置
}
}
return -1; //查找不成功,返回-1
}
int main(){
int Array[10]={1,23,34,45,67,78,765,2891,6789,13149};
int answer=BinarySearch(Array,765,10);
if(answer==-1)
{
printf("查找失败!\n");
}
else
{
printf("查找成功:位置 %d \n",answer);
}
return 0;
}
二分查找的时间复杂度为 log2(N)。
3.二分查找的评估:
二分查找的效率较高,但要求序列有序。序列排序本身就是一种高代价操作,往有序序列内插入和删除数据都比较困难。因此,二分查找特别适合于很少改动,但需要经常查找的表。