1.分块查找的步骤:
- 选取各块中的最大关键字构成一个索引表
- 对索引表尽心二分查找或顺序查找,对块中的数据进行顺序查找
2.分块查找特点:
- 索引表为有序表
- 块内节点可以无序
- 前一块的中的最大值要小于后一块的最小值
3.C++实现:

#include<iostream>
using namespace std;
typedef struct node{
int key; //关键字
int max; //最大关键字下标
}index;
typedef struct datatype{
int key; //关键字
};
void creat_primary_table(datatype s[], int n){ //创建主表
cout<<"请输入元素(要求前一块的最大值小于后一块的最小值):"<<endl;
int num,temp;
for(int i=0;i<=n-1;i++){
cin>>num;
s[i].key=num;
}
//cout<<"主表创建成功"<<endl;
}
void creat_index_table(datatype *s,int n,index *index,int &m,int L){ //按L块建立索引表
int keynum=n/L;
for(m=0;m<L;m++){//对索引表一一赋值
index[m].key=s[m*keynum].key;
for(int i=m*keynum;i<=m*keynum+keynum-1;i++){//查找每一块中的最大关键字
if(index[m].key<s[i].key){
index[m].key=s[i].key;
index[m].max=i;
}
}
}
//cout<<"索引表创建成功";
}
int Bi_search(index *index,datatype *s,int m,int keynum,int key){//二分查找确定关键字所在块,在块中进行顺序查找
//index为索引表,s为主表,m为索引表关键字个数,keynum为每块含有的关键字个数
int low=0,high=m-1,mid=(low+high)/2;
while(low<=high && high>-1){
if(index[mid].key==key){
high=mid;
break;
}
else if(key<index[mid].key) high=mid-1;
else low=mid+1;
mid=(low+high)/2;
}
int i=0,j;
if(key>index[mid].key)
i=index[mid+1].max;
else
i=index[mid].max;
i=i/keynum+1; //二分查找记录所在块,此时i的值为记录所在的块
for(j=i*keynum-keynum;j<i*keynum && j<m*keynum;j++)
if(key==s[j].key) //查找成功返回记录在主表中的下标
return j;
if(j>=m*keynum || j>i*keynum-1){
cout<<"未找到该元素";
return -1;
}
}
int main(){
int n=0,m=0,L=0;
cout<<"请输入元素总个数:";
cin>>n;
datatype s[n];
index index[n];
creat_primary_table(s,n); //s为主表,n为关键字个数
cout<<"创建的主表为:";
for(int i=0;i<=n-1;i++)
cout<<s[i].key<<" ";
cout<<endl<<"请输入需要分的块数:";
cin>>L;
creat_index_table(s,n,index,m,L);
cout<<"创建的索引表为:"<<endl;
for(int i=0;i<=m-1;i++){
cout<<index[i].key<<" ";
}
int key,subcript;
cout<<endl<<"请输入要查询元素(以-1退出):";
cin>>key;
while(key!=-1){
subcript=Bi_search(index,s,m,n/L,key);
if(subcript!=-1)
cout<<"查询元素"<<s[subcript].key<<"的下标为:"<<subcript;
cout<<endl<<"请输入要查询元素(以-1退出):";
cin>>key;
}
system("pause");
return 0;
}
