二分查找也属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。
那么什么是二分查找呢?二分查找的基本思想是, 在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。
从二分查找的定义我们可以看出,使用二分查找有两个前提条件:
1,待查找的列表必须有序。
2,必须使用线性表的顺序存储结构来存储数据。
下面是实现代码。
C语言代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | intBinSearch(SeqList*R,intn,KeyTypeK) { //在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1 intlow=0,high=n-1,mid;//置当前查找区间上、下界的初值 while(low<=high) { if(R[low].key==K) returnlow; if(R[high].key==k) returnhigh; //当前查找区间R[low..high]非空 mid=low+((high-low)/2); //使用(low+high)/2会有整数溢出的问题 //(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时, //这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题 if(R[mid].key==K) returnmid;//查找成功返回 if(R[mid].key>K) high=mid-1;//继续在R[low..mid-1]中查找 else low=mid+1;//继续在R[mid+1..high]中查找 } if(low>high) return-1;//当low>high时表示所查找区间内没有结果,查找失败 }//BinSeareh |