//实现分块法查找的算法
#include<stdio.h>
#include<malloc.h>
#include<malloc.h>
#define MAXL 100//表中最多的记录个数
#define MAXI 20//定义索引表中的最大长度
typedef int KeyType;
typedef char InfoType[10];
typedef struct
{
KeyType key;//关键字数据类型
InfoType data;//其他数据
}NodeType;
typedef NodeType SeqList[MAXL];//顺序表类型
typedef struct
{
KeyType key;//关键码类型
int link;//分块的起始下标
}IdxType;
typedef IdxType IDX[MAXI];//索引表类型
int IdxSearch(IDX I,int m,SeqList r,int n,KeyType k)//分块查找算法
{
int low=0,high=m-1,mid,i,count1=0,count2=0;
int b=n/m;//b为每块的记录个数
printf("二分查找:\n");
while(low<=high)//在索引表中进行二分查找,找到的位置放置low中
{
mid=(low+high)/2;
printf("第%d次查找,在[%d,%d]中查找到元素r[%d]:%d\n",count1+1,low,high,mid,r[mid].key);
if(I[mid].key>=k)
high=mid-1;
else
low=mid+1;
count1++;//累计在索引表中的比较次数
}
if(low<m)//在索引表中查找成功后,再在线性表中进行顺序查找
{
printf("比较%d次,在第%d块中查找到元素%d\n",count1,low,k);
i=I[low].link;
printf("顺序查找:\n ");
while(i<I[low].link+b-1 && r[i].key!=k)
{
i++;
count2++;
printf("%d ",r[i].key);
}
printf("\n");
printf("比较%d次,在顺序表中查找元素%d\n",count2,k);
if(i<=I[low].link+b-1)
return i;
else
return -1;
}
return -1;
}
int main()
{
SeqList r;
KeyType k=46;
IDX I;
int a[]={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},i;
int n;
n=sizeof(a)/4;
for(i=0;i<n;i++)//建立顺序表
r[i].key=a[i];
I[0].key=14;I[0].link=0;
I[1].key=34;I[1].link=4;
I[2].key=66;I[2].link=10;
I[3].key=85;I[3].link=15;
I[4].key=100;I[4].link=20;
printf("\n");
if((i=IdxSearch(I,5,r,25,k))!=-1)
printf("元素%d的位置是%d\n",k,i);
else
printf("\n元素 %d不在表中.\n",k);
printf("\n");
return 0;
}
数据结构源码笔记(C语言描述)汇总: