数据结构之查找

第九章   查找

1  顺序查找

在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从第一个开始逐个比较,直到找出与给定关键字相同的数为止。

  

2  折半查找

首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

3  分块查找

先选取各块中的最大关键字构成一个索引表;查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。

4   三种算法的比较

      

5  实践

实验内容:

(1)建立一个索引表(数据量大一些)

(2)对用户输入的数据进行查找。在索引表中查找用折半查找,在子表中查找用顺序查找。

代码展示:

typedef struct
{
   int key;        
}Record;
typedef struct         //索引表
{
	 int key; 
	 int link; 
}Indextable;

int main()
{
	int s,p,k,a1,a2,a3;
	Record T[10]={23,45,56,67,68,69,72,78,89,90};//有序的结构体数组
	Record R[18]={22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,57,86,53};//无序的结构体数组
	Indextable S[3]={{22,0},{48,6},{86,12}};//索引表数组
	printf("请输入你要查找的数:");
	scanf("%d",&a1);
	s=Seqsrch(R,18,a1);
	if(s)
           printf("该数:%d 在该结构体数组的第%d 个位置 \n",R[s].key,s+1);
	else
           printf("没找到该数!!!!\n");
	printf("请输入你要查找的数:");
	scanf("%d",&a2);
        p=Binsrch(T,10,a2);)
	if(p)
           printf("该数:%d 在该结构体数组的第%d 个位置 \n",T[p].key,p+1);
	else
           printf("没找到该数!!!!\n");
        printf("请输入你要查找的数:");
	scanf("%d",&a3);
	k=Blocksrch(R,S,3,18,a3);
	if(k)
           printf("该数:%d 在该结构体数组的第%d 个位置 \n",R[k].key,k+1);
	else
           printf("没找到该数!!!!\n");
	return 0;
}

int Seqsrch(Record R[],int n,int k)  //顺序查找     从后往前
{
   int i=n-1;
   //R[0].key=k;
   while(R[i].key!=k) //从后往前找
			i--;
   if(i>=0)
       return i; 
   else
       return 0;  
}
int BinsrchS(Indextable R[],int n,int k)   //折半查找  (索引表)
{
	 int low,hight,mid,found;
	 low=0;   
	 hight=n-1;
	 found=0;
	 while((low<=hight)&&(found==0))
	 {
	 	   mid=(low+hight)/2; 
	 	   if(k>R[mid].key)
			low=mid+1;
		   else if(k>=R[mid].key&&k<=R[mid+1].key)    
		   {
			  found=1;
			  break;
		   }
		   else
		      hight=mid-1;
		   if(k<=R[mid].key&&k>=R[mid-1].key)    
		   {
		       found=1;
		       break;
		   }
	 }
	 if(found==1)     
		  return mid;
	 else            
		  return 0;
}
int Binsrch(Record R[],int n,int k)   //折半查找  (有序结构体————递增的)
{
	 int low,hight,mid,found;
	 low=0;  
	 hight=n-1;
	 found=0;
	 while((low<=hight)&&(found==0))
	 {
	 	   mid=(low+hight)/2;  
	 	   if(k>R[mid].key)
			low=mid+1;
		   else if(k==R[mid].key)    
		         found=1;
		   else
			hight=mid-1;
	 }
	 if(found==1)     
		  return mid;
	 else            
		  return 0;
}
int Blocksrch(Record R[],Indextable S[],int b,int n,int k)     //分块查找
{
	 int i=0,j,p;
//	 while((k>S[i].key)&&(i<=b-1))  //在索引表表中顺序查找
//		  i++;
         i=BinsrchS(S,b,k); //折半查找索引表
	 if(i>=b)        
	    return 0;
	 j=S[i].link;    //确定开始查找的位置(索引表中得到)
	 if(i==b-1)
		  p=n-1;     //确定结束查找的位置(索引表中得到)
	 else
		  p=S[i+1].link-1; //确定结束查找的位置(索引表中得到)
	 while((j<p)&&(k!=R[j].key)&&(R[j].key<=S[i].key))   //从前往后查找
		  j++;
	 if(k!=R[j].key) //没找到
	    return 0;
	 return j;
}

  

转载于:https://www.cnblogs.com/huan0919/p/8428908.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值