数据结构----有序表的折半查找

折半查找概念

折半查找,又称二分查找。
前提是线性表中的记录必须是关键码有序(由小到大或由大到小),线性表必须采用顺序存储。
思路:在有序表中,取中间值为比较对象,如果给定的值和中间值的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定的值大于中间值的关键字,则在中间记录的右半区继续查找。重复上述过程,直到查找成功,或查找所有区域无记录,返回查找失败。

#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("表中无此元素!");
	}
}

在这里插入图片描述

  • 2
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值