如果想要详细了解分块查找,请点击:
http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm
秘诀:先分块,再匹配。分而治之
步骤:
1.先取各块中的最大关键字构成一个索引表。
2.查找分为两部分,先对索引表进行二分查找或是顺序查找,以确定待查记录在哪一块中。
3.然后,在已经确定的块中用顺序法进行查找。
分块查找的性能介于顺序查找和对半查找之间。
分块查找的优点:
1.在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。
2.因为块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。
缺点:分块查找算法的主要代价是增加一个辅助数组的存储空间。
分块时间是按照顺序查找的:
#include<cstdio>
struct indexBlock{ //定义块的结构
int key;
int start;
int endx;
}indexBlock[4]; //定义结构体数组
int blockSearch(int x, int a[]){
int i=0;
int j;
while(i<3 && x>indexBlock[i].key) //确定在哪个块中
i++;
if(i>=3) //大于分的块数,则返回-1,找不到该数
return -1;
j=indexBlock[i].start; //j等于块范围的起始值
while(j<=indexBlock[i].endx && a[j]!=x) //在确定的块内进行查找
j++;
if(j>indexBlock[i].endx) //如果大于块范围的结束值,则说明没有要查找的数,j置为-1
j=-1;
return j;
}
int main(){
int j=-1,k,x;
int a[16];
for(int i=0;i<16;i++)
a[i]=i+1;
printf("已知有一组数组\n");
for(int i=0;i<15;i++)
printf("%d ",a[i]);
printf("\n");
for(int i=0;i<3;i++){
indexBlock[i].start=j+1; //确定每个块范围的起始值
j=j+1;
indexBlock[i].endx=j+4; //确定每个块范围的结束值
j=j+4;
indexBlock[i].key=a[j]; //确定每个块范围中元素的最大值
}
printf("请输入你要查找的数字\n");
scanf("%d",&x);
k=blockSearch(x,a);
if(k>=0)
printf("查找成功,你要查找的数字在数组中的位置为%d\n",k);
else
printf("查找失败\n");
}