折半查找概念
折半查找,又称二分查找。
前提是线性表中的记录必须是关键码有序(由小到大或由大到小),线性表必须采用顺序存储。
思路:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间值的关键字,则在中间记录的右半区继续查找。重复上述过程,直到查找成功,或查找所有区域无记录,返回查找失败。
#include<stdio.h>
#include<malloc.h>
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
typedef int KeyType;
typedef struct{
int *elem;
int length;
}SSTable;
int Search_Bin(SSTable ST,KeyType key){
//有序表St中找key。若找的,则函数值为该元素在表中的位置
//,,,否则 为0
int low,high,mid;
low=1;
high=ST.length;
while(low<=high){
mid=(low+high)/2;
if(EQ(key,ST.elem[mid])){
return mid;
}else if(LT(key,ST.elem[mid])){
high=mid-1;
}else{
low=mid+1;
}
}
return 0;
}
int main(){
int i,key,location;
SSTable ST;
ST.elem=(int*)malloc((ST.length+1)*sizeof(int));
printf("请输入表的长度:\n");
scanf("%d",&ST.length);
printf("请输入待查找表中的元素:\n");
for(i=1;i<=ST.length;i++){
scanf("%d",&ST.elem[i]);
}
printf("请输入要查找的元素:\n");
scanf("%d",&key);
if(Search_Bin(ST,key)){
location=Search_Bin(ST,key);
printf("要查找的元素的位置为:%d\n",location);
}else if(!Search_Bin(ST,key)){
printf("表中无此元素!");
}
}