索引顺序表(分块查找)

索引顺序表(分块查找)

原文章 分块查找

#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define MAX 5                               //索引表的最大长度
int a[MAXSIZE]={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};
typedef struct
{
    int key;                                //关键字
    int link;                               //指向对应块的起始下标
}IdxType;
IdxType IDX[MAX];
void InitIDX()                              //索引表初始化
{
    IDX[0].key=14;
    IDX[0].link=0;
    IDX[1].key=34;
    IDX[1].link=5;
    IDX[2].key=66;
    IDX[2].link=10;
    IDX[3].key=85;
    IDX[3].link=15;
    IDX[4].key=100;
    IDX[4].link=20;
}
typedef struct
{
    int data[MAXSIZE];                     //存放数据表元素
    int length;                            //存放数据表长度
}Sqlist;
void InitSqlist(Sqlist *&s)                //顺序表初始化
{
    s=(Sqlist *)malloc(sizeof(Sqlist));
    s->length=0;
}
void CreatSqlist(Sqlist *&s,int a[])       //创建顺序表
{
    int i;
    for(i=0;i<MAXSIZE;i++)
    s->data[i]=a[i];
    s->length=MAXSIZE;
}
void PrintSqlist(Sqlist *s)                //输出顺序表
{
    int i;
    for(i=0;i<MAXSIZE;i++)
    printf("%d ",s->data[i]);
    printf("\n");
}
int IdxSearch(Sqlist *s,IdxType IDX[],int m,int k)//分块查找
{
    int low=0,high=m-1,mid,i;
    int b=MAXSIZE/m;                             //b为每块的记录个数
    while(low<=high)                             //在索引表进行二分查找,找到的位置放在low中
    {
        mid=(low+high)/2;
        if(IDX[mid].key>=k)
            high=mid-1;
        else
            low=mid+1;
    }
    if(low<m)                                    //在索引表中查找成功后,再在线性表中进行顺序查找
    {
        i=IDX[low].link;
    while(i<=IDX[low].link+b-1&&s->data[i]!=k)
        i++;
    if(i<=IDX[low].link+b-1)
        return i;
    else
        return -1;
    }
    return -1;
}
int main()
{
    int temp;
    Sqlist *p;
    InitIDX();
    InitSqlist(p);
    CreatSqlist(p,a);
    printf("顺序表元素如下:\n");
    PrintSqlist(p);
    printf("分块查找元素18:\n");
    temp=IdxSearch(p,IDX,5,18);
    printf("该数据在顺序表中下标为%d: ",temp);
    printf("\n");
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值