分块查找
介于顺序查找与折半查找之间。
算法描述:
1.将按块有序的数据元素分成n块,每一块中结点不必有序,但块间必须有序。
2.将各块中的最大关键字构成索引表
3.查找想要查询元素num在索引表的位置
4.在块内顺序查询关键字。
#include<stdio.h>
typedef struct node
{
int start; //定义每个数据块的头,尾及最大
int key;
int tail;
}Key;
BlockSearch(int a[]);
void main()
{
int m;
int a[]={42,63,82,89,123,146,223,254,325,336,378,578,687,923,998};
m=BlockSearch(a);
printf("%d",m);
}
int BlockSearch(int a[])
{
Key index[4];
int i,j=-1;
int num;
for(i=0;i<3;i++)//查找最大关键字
{
index[i].start=j+1;
j=j+1;
index[i].tail=j+4;
j=j+4;
index[i].key=a[j];
}
printf("请输入想要查找的数据:");
scanf("%d",&num);
i=0;
while(i<3&&num>index[i].key)
{
i++;
}
if(i>=3)
return -1;
for(j=index[i].start;j<=index[i].tail;j++)
{
if(a[j]==num)
return j+1;
}
return -1;
}