索引顺序表(分块查找)
原文章 分块查找
#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");
}