【分块查找】

如果想要详细了解分块查找,请点击:

http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm


秘诀:先分块,再匹配。分而治之

 

步骤:

1.先取各块中的最大关键字构成一个索引表。

2.查找分为两部分,先对索引表进行二分查找或是顺序查找,以确定待查记录在哪一块中。

3.然后,在已经确定的块中用顺序法进行查找。 

分块查找的性能介于顺序查找和对半查找之间。


分块查找的优点:

1.在表中插入或删除一个记录时,只要找到该记录所属的块,就在该块内进行插入和删除运算。

2.因为块内记录的存放是任意的,所以插入或删除比较容易,无须移动大量记录。

缺点:分块查找算法的主要代价是增加一个辅助数组的存储空间。 



分块时间是按照顺序查找的:

#include
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");

}


你可能感兴趣的:(【考研数据结构】)