我是靠谱客的博主 幸福书本,最近开发中收集的这篇文章主要介绍实现分块查找的算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

输出顺序表(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)中采用分块查找的方法查找(每块的块长为5,共有5块)关键字46的过程。

#include <stdio.h>
#define MAXL 100
//定义表中最多记录个数
#define MAXI 20
//定义索引表的最大长度
typedef int KeyType;
typedef char InfoType[10];
typedef struct
{
KeyType key;
//KeyType为关键字的数据类型
InfoType data;
//其他数据
} NodeType;
typedef NodeType SeqList[MAXL];
//顺序表类型
typedef struct
{
KeyType key;
//KeyType为关键字的类型
int link;
//指向分块的起始下标
} IdxType;
typedef IdxType IDX[MAXI];
//索引表类型
int IdxSearch(IDX I,int m,SeqList R,int n,KeyType k)
//分块查找算法
{
int low=0,high=m-1,mid,i,count1=0,count2=0;
int b=n/m;
//b为每块的记录个数
printf("二分查找n");
while (low<=high)
//在索引表中进行二分查找,找到的位置存放在low中
{
mid=(low+high)/2;
printf("
第%d次比较:在[%d,%d]中比较元素R[%d]:%dn",count1+1,low,high,mid,R[mid].key);
if (I[mid].key>=k)
high=mid-1;
else
low=mid+1;
count1++;
//累计在索引表中的比较次数
}
if (low<m)
//在索引表中查找成功后,再在线性表中进行顺序查找
{
printf("比较%d次,在第%d块中查找元素%dn",count1,low,k);
i=I[low].link;
printf("顺序查找:n
");
while (i<=I[low].link+b-1 && R[i].key!=k)
{
i++;count2++;
printf("%d ",R[i].key);
}
//count2累计在顺序表对应块中的比较次数
printf("n");
printf("比较%d次,在顺序表中查找元素%dn",count2,k);
if (i<=I[low].link+b-1)
return i;
else
return -1;
}
return -1;
}
int
main()
{
SeqList R;
KeyType k=46;
IDX I;
int a[]={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},i;
for (i=0;i<25;i++)
//建立顺序表
R[i].key=a[i];
I[0].key=14;I[0].link=0;
I[1].key=34;I[1].link=4;
I[2].key=66;I[2].link=10;
I[3].key=85;I[3].link=15;
I[4].key=100;I[4].link=20;
if ((i=IdxSearch(I,5,R,25,k))!=-1)
printf("元素%d的位置是%dn",k,i);
else
printf("元素%d不在表中n",k);
printf("n");
}

最后

以上就是幸福书本为你收集整理的实现分块查找的算法的全部内容,希望文章能够帮你解决实现分块查找的算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部