索引顺序表(分块查找)

来源:互联网 发布:小区内的网络超市 编辑:程序博客网 时间:2024/06/08 15:01

索引顺序表(分块查找)

原文章 分块查找

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

这里写图片描述