#include<iostream>
using namespace std;
#include<vector>
using std::vector;
#define N 5//共分成几个块
#define M 5//每个块里的个数
struct Index{
int key;
int link;
};
int idxsearch(vector<int>& vint,int x,Index vidx[])
//在vector<int>容器中寻找值为x的元素下标,对该容器建立的索引为Index数组
{
int low=0,high=N-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(x>vidx[mid].key)
low=mid+1;
else
high=mid-1;
}//找块完毕
for(int i=vidx[high+1].link;i!=vidx[high+1].link+M;i++)
{
if(x==vint[i])
return i;//找到元素则返回位置
}
return -1;//未找到元素返回-1
}
int main()
{
int arr[25]={4,14,6,7,3,//观察每行的数是随机无序的,但都在一个区间即块内,而这些块是有序的,因此查询时对块可以二分查找,但块内不行
24,22,16,34,15,
35,37,66,56,44,
67,78,77,73,85,
87,96,93,89,100};
vector<int> vec(25);
int x;
for(int i=0;i!=vec.size();i++)
vec[i]=arr[i];
for(i=0;i!=vec.size();i++)
cout<<vec[i]<<",";//数据引入到容器中并显示
Index idx[N];
idx[0].key=14;//key为该块中的最大值,link为该块的起始下标
idx[0].link=0;
idx[1].key=34;
idx[1].link=5;
idx[2].key=66;
idx[2].link=10;
idx[3].key=85;
idx[3].link=15;
idx[4].key=100;
idx[4].link=20;
cout<<endl<<"请输入要查找的数:"<<endl;
cin>>x;
int ans=idxsearch(vec,x,idx);
cout<<endl;
cout<<"ans:"<<ans<<endl;
return 0;
}
自写的分块查找的简单示例
最新推荐文章于 2020-11-15 20:19:34 发布