分块查找

来源:互联网 发布:淘宝低于5元不计销量 编辑:程序博客网 时间:2024/05/17 12:56

//分块查找的原理:假设共有n个数据,分成b快数据,每块的数据不一定有序,

//但前一块数据的最大数据必须小于后一块数据中的最小数据。

#include "stdafx.h"

const int num = 25;//测试个数

int Biggest[num];//用来保存快中的最大值s

struct Test

{

   intdata;

   intlink;//指向对应快的起始下标

};

 

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[])

{

   intdiv,target;

  cout<<"假设有五组数据,一共有"<<num<<"个记录:"<<endl;

   div =5;

   TestNum[num];

  Initial(Num,div);

  cout<<"请输入目标数据"<<endl;

  cin>>target;

   Search(Num,target,div);

   return0;

}

 

原创粉丝点击