分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
时间复杂度:O(log(m)+n/m)
算法思想
:将n个数据元素"按块有序"划分为m块(m ≤ n)。每一块中的结点不必有序,但块与块之间必须"按块有序";即第1块中任一元素的关键字都必须小于第2块中任一元素的关键字;而第2块中任一元素又都必须小于第3块中的任一元素,……
算法流程
:
step1 先选取各块中的最大关键字构成一个索引表;
step2 查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;然后,在已确定的块中用顺序法进行查找。
const int MAXL = 50;
template <class T>
typedef struct{
T key; //T为关键字的数据类型
char data[10]; //其它数据
}NodeType;
typedef NodeType SeqList[MAXL]; //顺序表类型
template <class T>
typedef struct{
T key; //T为关键字的类型
int link; //指向对应块的起始下标
}IdxType;
typedef IdxType IDX[MAXL]; //索引表类型
//参数:I:索引表;m:分块的数量;R:要查找的数据表;n:数据表中元素个数;k:要查找的数值
int Idx_Search(IDX I, int m, SeqList R, int n, KeyType k){
//二分查找索引表
int low = 0;
int high = m - 1;
int mid;
int i;
int b = n/m; //b为每块的记录个数
while(low<=high){
mid = low + ((high - low)>>1);
if(I[mid].key >= k)
high = mid - 1;
else
low = mid + 1;
}
i = I[high + 1].link;
while(i <= I[high+1].link + b - 1&&R[i].key != k) //在顺序表中固定块里查找
i++;
if(i <= I[high+1].link + b - 1)
return i+1;
else
return 0;
}