数据结构上机——分块查找

举报
zstar 发表于 2022/08/06 02:40:10 2022/08/06
【摘要】 分块查找,原理上还是非常容易理解的 题目也没出幺蛾子,相比于课本代码,甚至作出了优化 课本代码给出了分块的起始位置,而它还给出了末尾位置 具体思路是: 先用二分查找,查询所在块 再在块中进行顺序查找 代码...

分块查找,原理上还是非常容易理解的
题目也没出幺蛾子,相比于课本代码,甚至作出了优化
课本代码给出了分块的起始位置,而它还给出了末尾位置
具体思路是:
先用二分查找,查询所在块
再在块中进行顺序查找
代码如下:

//分块查找的程序代码
#include<stdio.h>
//类型定义
typedef int keytype;
typedef struct
{
	keytype key;
	int low,high;
}index;
typedef struct
{
	keytype key;
}record;
const int recN=18;
const int idxN=3;

int blksearch(record[],index[],keytype,int);
int main()
{
	record r[recN]={22,12,13,8,9,20,33,42,44,38,24,48,60,58,74,49,86,53};
	index idx[idxN]={{22,0,5},{48,6,11},{86,12,17}};
	keytype key;
	int loc,i;
	printf("待查找的记录关键字表:\n");
	for(i=0;i<recN;i++)
		printf("%5d",r[i]);
	printf("\n");
	printf("输入所要查找记录的关键字:");
	scanf("%d",&key);
	loc=blksearch(r,idx,key,idxN);
	if(loc!=-1) printf("查找到,是第%d个记录。\n",loc+1);
	else printf("记录查找不到!\n");
}

//添加折半查找索引表,块内顺序查找算法
int blksearch(record r[],index idx[],keytype key,int idxN)
{
	int low,high=idxN-1,mid,i,j;
	{
		while(low<=high)
		{
			mid=(low+high)/2;
			if(idx[mid].key>=key) high=mid-1;
			else low=mid+1;
		}
		if(low<idxN)
		{
			i=idx[low].high;
			j=idx[low].low;
			while(r[i].key!=key&&i>=j)i--;
			if(i>=j)return i;
		}
		return -1;
	}
}



  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

文章来源: zstar.blog.csdn.net,作者:zstar-_,版权归原作者所有,如需转载,请联系作者。

原文链接:zstar.blog.csdn.net/article/details/111304950

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。