分塊查找

#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  
*/
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章