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

折半查找概念

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

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

在这里插入图片描述

发布了43 篇原创文章 · 获赞 6 · 访问量 1531

猜你喜欢

转载自blog.csdn.net/weixin_43729631/article/details/103388294
今日推荐