8.2.3 分块查找法

分块查找法要求将列表组织成以下两种索引顺序结构:

①首先将列表分成若干个块(子表)。一般情况下,块的长度均匀,最后一块可以不满。每块中元素任意排列,即块内无序,但块与块之间有序。

②构造一个索引表。其中每个索引项对应一个块并记录每块的起始位置,以及每块中的最大关键字(或最小关键字)。索引表按关键字有序排列。

 

上图所示为一个索引顺序表。其中包括三个块,第一个块的其实地址为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; 
} 

 测试结果:

 

猜你喜欢

转载自blog.csdn.net/weixin_42617472/article/details/85118091