#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
*/