分块查找

#include < iostream .h >
#define MaxSize 30 //MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
#define ILMSize 10 //ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef int IndexKeyType;
typedef int KeyType;
struct ElemType
{
    int key;
};
struct IndexItem
{
    IndexKeyType index;//IndexKeyType为事先定义的索引值类型
    int start;//子表中第一个元素所在的下标位置
    int length;//子表的长度域
};
typedef IndexItem indexlist[ILMSize];//ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef ElemType mainlist[MaxSize];//MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
int Blocksch(mainlist A,indexlist B,int m,KeyType k)
    //利用主表A和大小为m的索引表B分块查找关键字为k的记录
{
    int i,j;
    //在索引表中顺序查找关键字为k所对应的索引项
    for(i=0;i
< m ;i++)
        if(k<
=B[i].index)
            
break;
    //若i等于m,则表明查找失败,返回-1
    if(i
==m)
        
return -1;
    //在已经查找到的第i个子表中顺序查找关键字为k的记录
    j
=B[i].start;
    
while(j<B[i].start+B[i].length)
        if(k
==A[j].key)
            
break;
        else
            j++;
    //若查找成功则返回元素的下标值,否则返回-1
        if(j<B[i].start+B[i].length)
            return j;
        else
            return -1;

}
void main()
{
    int i;
    int m
=3;
    
int mlnum =15;//主表中元素的个数
    
indexlist B;
    mainlist A;
    cout<<"输入主表中的(子表中元素要满足块间有序:我们这里设升序,块内无序)"<<mlnum<<"个元素"<<endl;
    for(i
=0;i<mlnum;i++)
        
cin > >A[i].key;
    cout
< <"输入"<<m <<"个索引项(索引值:保存第个块的最大值,这里我们按升序排列、子表中第一个元素所在的下标位置、子表的长度域:"<<endl;
    cout<<"这里用n表示第n块"<<endl;
    for(i
=0;i<m;i++)
        
cin > >B[i].index>>B[i].start>>B[i].length;
    int k;
    cout
< <"输入要查找的数"<<endl ;
    cin
> >k;
    int findindex=Blocksch(A,B,m,k);
    if(findindex!=-1)
        cout
< <"找到,下标为: "<<findindex<<"值为:"<<A[findindex].key<<endl;
    else
        cout<<"没找到"<<endl;

    
}
//测试用例
/*
输入主表中的(子表中元素要满足块间有序:我们这里设升序,块内无序)15个元素
1 4 2 3 5 10 6 9 8 7 11 15 13 12 10
输入3个索引项(索引值:保存第个块的最大值,这里我们按升序排列、子表中第一个元素所
在的下标位置、子表的长度域:
这里用n表示第n块
5 0 5
10 5 5
15 10 5
输入要查找的数
12
找到,下标为:13值为:12
*/

/*
http://java2.xinwen365.net

QQ群:
34409541 讨论网页  
34409326 讨论JAVA 已满 
34408784 讨论VC++  
34409699 讨论VC++  
9143041 讨论MFC编程  
10614204 讨论C#  
10613030 讨论Win32编程  
10613067 讨论游戏开发  
18779860 讨论JAVA  
*/
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值