- 分块查找
分块查找(block search)是一种性能介于顺序查找和折半查找之间的查找方法。它要求按如下的索引方式来存储线性表:将表 R[0..n-1]均分为b块,前b-1块中的元素个数为s=「n/b] 最后一块(即第b块)的元素数小于等于s;每一块中的关键字不一定是有序的,但前一块中的最大关键字必须小于后一块中的最小关键字,即要求整个表是“分块有序”(block order)的。
while(low <= high)
{
int mid = (low + high)/2;
if(arr[mid] == key)
return mid;
else if(arr[mid] > key)
high = mid - 1;
else
low = mid + 1;
}
(二)、树表的查找
若要对动态查找表进行高效率的查找,可采用几种特殊的二叉树/树作为表的组织形式,在这里将它们统称为树表(tree table)。
- 二叉排序树
二叉排序树(又称二叉搜索树)或者是空树,或者是满足以下下性质的二叉树:
- 若它的左子树不空,则左子树上所有关键字的值均小于根关键字的值;
- 若它的右子树不空,则右子树上所有关关键字的值均大于根关键字的值;
- 左右子树又各是一棵二叉排序树。
BTNode* BSTSearch(BTNode* p, int key) //不容易考到
{
while(p != NULL)
{
if (key == p->key)
return p;
else if (key < p->key)
p = p->lChild;
else
p = p->rChild;
}
return NULL;
}
BTNode* BSTSearch(BTNode* p, int key)//递归实行更容易考到
{
if(p == NULL)
return NULL;
else{
if(p->key == key)
return p;
else if(key < p->key)
return BSTSearch(p->lChild, key);
else
return BSTSearch(p->rChild, key);
}
}
int BSTInsert(BTNode *&p, int key)
{
if(p == NULL)
{
p = (BTNode*)malloc(sizeof(BTNode));
p->lChild = p->rChild=NULL;
p->key = key;
return 1;
}
else
{
if(key == p->key)
return 0; //已经存在了,显示插入失败
else if(key < p->key)
return BSTInsert(p->lChild, key);
else
return BSTInsert(p->rChild, key);
}
}