数据结构之折半和分块查找

#折半查找:
int BinSearch(RecType R[],int n,KeyType k)
{
	int low=0,high=n-1,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(k==R[mid].key)
			cout<<mid+1<<endl;
		if(k<R[mid].key)
			high=mid-1;
		else
			low=mid+1;
	}
	return 0;
}


#分块查找:
typedef struct
{
	KeyType key;
	int link;
}IdxType;
int IdxSearch(IdxType I[],int b,RecType R[],int n,KeyType k)
{	int s=n/b;
	int low=0,high=b-1,mid,i;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(I[mid].key>=k)
			high=mid-1;
		else
			low=mid+1;
	}
	i=I[high+1].link;
	while(i<=I[high+1].link+s-1 && R[i].key!=k)
		i++;
	if(i<=I[high+1].link+s-1)
		cout<<"关键字的逻辑序号为:"<<i+1<<endl;
	else
	    cout<<"该值不存在,查找结束!"<<endl;
	return 0;
}

 

#折半
#include <iostream>
using namespace std;
typedef int KeyType;
typedef struct{
	KeyType key;
}RecType;
int BinSearch(RecType R[],int n,KeyType k)
{
	int low=0,high=n-1,mid;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(k==R[mid].key)
			cout<<mid+1<<endl;
		if(k<R[mid].key)
			high=mid-1;
		else
			low=mid+1;
	}
	return 0;
}
int main()
{
    RecType R[10]={1,2,3,4,5,6,7,8,9,10};
	KeyType key;
	cout<<"请输入想要查找的值:"<<endl;
	cin>>key;
	BinSearch(R,10,key);
	return 0;
}
#分块
#include <iostream>
using namespace std;
typedef int KeyType;
typedef struct
{
	KeyType key;
}RecType;
typedef struct
{
	KeyType key;
	int link;
}IdxType;
int IdxSearch(IdxType I[],int b,RecType R[],int n,KeyType k)
{
	int s=n/b;
	int low=0,high=b-1,mid,i;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(I[mid].key>=k)
			high=mid-1;
		else
			low=mid+1;
	}
	i=I[high+1].link;
	while(i<=I[high+1].link+s-1 && R[i].key!=k)
		i++;
	if(i<=I[high+1].link+s-1)
		cout<<"关键字的逻辑序号为:"<<i+1<<endl;
	else
	    cout<<"该值不存在,查找结束!"<<endl;
	return 0;
}
int main()
{
	RecType R[25]={8,14,6,9,10,22,34,18,19,31,40,38,54,66,46,71,78,68,80,85,100,94,88,96,87};
	IdxType I[5]={14,34,66,85,100};
	KeyType k;
	cout<<"请输入想要查找的关键字:"<<endl;
	cin>>k;
    I[0].key=14;
	I[1].key=34;
	I[2].key=66;
	I[3].key=85;
	I[4].key=100;
   I[0].link=0;
	I[1].link=4;
	I[2].link=10;
	I[3].link=15;
	I[4].link=20;
	IdxSearch(I,5,R,25,k);
	return 0;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值