索引顺序查找(分块查找)算法

索引顺序查找(分块查找)算法

算法分析:

将n个数据元素按块有序的划分为m块(m不能大于n)。每一块的元素可以不是有序的,但块与块之间必须有序,第一块中的任一元素的关键字都必须小于第二块任一元素的关键字,第二块中的任一元素都要小于第三块中的任一元素······

具体操作:

1>先去各块的最大关键字构成索引表。
2>查找分为两部分,先对索引表进行二分查找或顺序查找,已确定待查记录在哪一块中。
3>然后,在已经确实的块中用顺序法进行查找。注意这里的这一步只能用顺序法。

  • 代码
#include<stdio.h>

struct index
{
    int key;
    int start;
    int end;
}index[4];
int main()
{
    int search(int key, int a[]);
    int i, j = -1, k, key;
    int a[] = {42,63,82,89,111,146,219,254,325,336,348,795,876,951,998};
    printf("已知有一组数:\n");
    for(i = 0; i<15; i++)
        printf("%d,",a[i]);
    printf("\n");
    for(i = 0; i < 3;i++)
    {
        index[i].start = j + 1;
        j += 1;
        index[i].end = j + 4;
        j += 4;
        index[i].key = a[j];
    }
    printf("Enter the number that need to search:\n");
    scanf("%d", &key);
    k = search(key, a);
    if(k >= 0)
        printf("The number %d is the %d element in the array\n",key, k+ 1);
    else
        printf("Don't search the number\n");
}
int search(int key, int a[])
{
    int i, j;
    i = 0;
    while(i < 3 && key > index[i].key)
        i++;
    if(i >= 3)
        return -1;
    j = index[i].start;
    while(j <= index[i].end && a[j] != key)
                j++;
    if(j > index[i].end)
        j = -1;
    return j;
}
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值