分块查找法要求将列表组织成以下两种索引顺序结构:
①首先将列表分成若干个块(子表)。一般情况下,块的长度均匀,最后一块可以不满。每块中元素任意排列,即块内无序,但块与块之间有序。
②构造一个索引表。其中每个索引项对应一个块并记录每块的起始位置,以及每块中的最大关键字(或最小关键字)。索引表按关键字有序排列。
上图所示为一个索引顺序表。其中包括三个块,第一个块的其实地址为0,块内最大关键字为25;第二个块的起始地址为5,块内最大关键字为58;第三个块的起始地址为10,块内最大关键字为88。
分块查找的基本过程:
①首先,将待查关键字k与索引表中的关键字进行比较,以确定待查记录所在的块。具体的可用顺序查找法或折半查找法进行。
②进一步用顺序查找法,在相应块内查找关键字为k的元素。
分块查找法:
#include<iostream>
using namespace std;
int main()
{
cout<<"请输入列表中数据元素的个数"<<endl;
int num1=0; //列表中数据元素的个数
cin>>num1;
int arr[num1];
cout<<"请依次输入"<<num1<<"个数据"<<endl;
for(int i=0;i<num1;i++)
{
cin>>arr[i];
}
int num2=0; //把数据分为num2个块
cout<<"请输入需要把数据分成多少块"<<endl;
cin>>num2;
int table[2][num2];
cout<<"请从小到大输入"<<num2<<"个数据,对各块的起始地址进行赋值"<<endl;
for(int i=0;i<num2;i++)
{
cin>>table[1][i];
}
cout<<"请依次将各个块的最大值输入"<<endl;
for(int i=0;i<num2;i++)
{
cin>>table[0][i];
}
//开始查找
cout<<"请输入要查找的值"<<endl;
int key=0;
cin>>key;
int low=0,high=num2-1;
int num3;//key位于第num3块
int temp=num2-1; //采用顺序查找法倒序查找
while(key<=table[0][temp]&&temp>=0)
{
num3=temp;
temp--;
}
cout<<"数据位于第"<<num3<<"块"<<endl;
//在块内查找
int j=table[1][num3];
while(j<table[1][num3+1]||j<num1)
{
if(key==arr[j])
{
cout<<"数据元素"<<key<<"位于第"<<j<<"个";
return 0;
}
else
{
j++;
}
}
cout<<"找不到数据元素:"<<key<<endl;
}
测试结果: