数据结构之折半查找
数据结构之--折半查找
定义:折半查找技术,也就是二分查找。它的前提是线性表中的记录必须是关键码有序(通常从大到小有序),线性表必须采用顺序存储。折半查找的基本思想是:取中间记录作为比较对象,若给定值与中间记录的关键字,则在中间记录的关键字相等,则查找成功;若给定值小于中间记录的作伴去继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。
图解:
时间复杂度:由于具有n个节点的完全二叉树的深度为⌊log₂n⌋+1,尽管折半查找判定二叉树并不是完全二叉树,但同样相同的推导可以得出,最坏的情况查找到关键字或者查找失败的次数为⌊log₂n⌋+1。因此我们折半算法的时间复杂度为:O(logn),它显然远远好于顺序查找的O(n)的时间复杂度了。
#include<stdio.h>
int Binary_Search(int *a,int n,int key){
int low,mid,high;
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;
}
void main(){
int num[] = {0,1,16,24,35,47,59,62,73,88,99};
int result = Binary_Search(num,sizeof(num)/sizeof(num[0])-1,62);
printf("查找结果为:%d\n",result);
}
运行结果为: