//分块查找的原理:假设共有n个数据,分成b快数据,每块的数据不一定有序,
//但前一块数据的最大数据必须小于后一块数据中的最小数据。
#include "stdafx.h"
const int num = 25;//测试个数
int Biggest[num];//用来保存快中的最大值s
struct Test
{
int data;
int link;//指向对应快的起始下标
};
void Initial(Test Num[],int div)
{
cout<<"请输入"<<num<<"个数据"<<endl;
for (int i = 0; i < num; i++)
{
cin>>Num[i].data;
}
int n = num / div;//每块的数据个数
for (int i = 0; i < div; i++)
{
Num[i].link = i * n;//对应快的起始下标
}
for (int i = 0; i < div; i++)
{
int max = -888;
for (int j = Num[i].link; j < Num[i].link + n; j++)
{
if(Num[j].data > max)
{
max = Num[j].data;
}
}
Biggest[i] = max;//保存每块中的最大值
}
}
int Search(Test Num[],int data,int div)
{
for(int i = 0; i < div - 1; i++)
{
if(Biggest[i] < data && Biggest[i + 1])
{
for (int j = Num[i + 1].link; i < Num[i + 1].link + num / div; j++)
{
if(Num[j].data == data)
{
cout<<"找到位置:"<<j<<endl;
return j;
}
}
}
}
cout<<"没有找到该数据"<<endl;
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int div,target;
cout<<"假设有五组数据,一共有"<<num<<"个记录:"<<endl;
div = 5;
Test Num[num];
Initial(Num,div);
cout<<"请输入目标数据"<<endl;
cin>>target;
Search(Num,target,div);
return 0;
}