分块查找

分块查找是折半查找和顺序查找的一种改进方法,分块查找由于只要求索引表是有序的,对块内节点没有排序要求,因此特别适合于节点动态变化的情况。
索引表分为m块,每块含有N/m个元素,块内是无序的,块间是有序的,例如块2中最大元素小于块3中最小元素。
先用二分查找索引表,确定需要查找的关键字在哪一块,然后再在相应的块内用顺序查找。
#include<stdio.h>
//第一块最大值小于第二块最小值,第二块最大值小于第三块最小值
struct index
{
    int key;
    int start;
    int end;
}index_table[4];

int block_search(int key,int a[])
{
    int i=1,j;
    while(i<=3&&key>index_table[i].key)         //确定在哪个快中
        i++;
    if(i>3)                                     //大于分得的块数,则返回0
        return 0;
    j=index_table[i].start;                     //j等于块范围的起始值
    while(j<=index_table[i].end&&a[j]!=key)     //在确定的块内进行顺序查找
        j++;
    if(j>index_table[i].end)                    //如果大于块范围的结束值,则说明没有要查找的数,j置0
        j=0;
    return j;
}

void main()
{
    int i,j=0,k,key,a[16];
    printf("请按序输入15个数:\n");
    for(i=1;i<16;i++)
        scanf("%d",&a[i]);
    for(i=1;i<=3;i++)
    {
        index_table[i].start=j+1;               //确定每个块范围的起始值
        j=j+1;
        index_table[i].end=j+4;                 //确定每个块范围的结束值
        j=j+4;
        index_table[i].key=a[j];                //确定每个块范围中元素的最大值
    }
    printf("请输入你想查找的元素:\n");
    scanf("%d",&key);
    k=block_search(key,a);
    if(k!=0)
        printf("查找成功!其位置是:%d\n",k);
    else
        printf("查找失败!");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值