查找
一、静态查找(Static Search Table)
顺序查找的存储结构
typedef struct {
int key; //关键字
}ElemType;
typedef struct {
ElemType *elem; //数据元素存储空间基址
int length; //表长度
顺序查找(Sequential Search)
//顺序查找
int Search_Seq(SSTable ST, int key)
{//在顺序表ST中顺序查找其关键字等于key的元素,若找到,怎函数值为该元素在表中的位置,否则为0
ST.elem[0].key = key;
//起到监视哨的作用,目的在于免去查找过程中每一步都要检测整个表是否查找完毕
int i;
for(i = ST.length; ST.elem[i].key != key; i-- );
return i;
}
折半查找(Binary Search)
算法思想:
- 先确定待查记录的范围。
- 给定的值与中间记录进行比较
若相等,则找到, 返回位置。
若不相等,则缩小范围在前半部分或后半部分。 - 重复2,直到找到或不存在范围找不到结束。
//折半查找
int Search_Bin(SSTable ST, int key)
{//关键字有序
int min, max, mid;
min = 1;
max = ST.length;
while(min <= max)
{
mid = (min + max)/2;
if(ST.elem[mid].key == key)
return mid;
else if(ST.elem[mid].key > key)
max = mid - 1;
else
min = mid + 1;
}
return 0;
}
二、动态查找(Dynamic Search Table)
动态查找表的特点:
- 表结构本身是在查找过程中动态生成的。即对给定值key, 若表中有其关键字等于key的记录,则查找成功返回,否则插入关
键字等于key的记录。
二叉排序树(Binary Sort Tree)
什么是二叉排序树?(二叉查找树)
或者是一棵空树,或者是具有下面性质的二叉树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根的值;
- 它的左、右子树也分别是二叉排序树。
//二叉排序树
BiTree SearchBST(BiTree T,int key)
{//查找成功,返回指向该数据元素结点的指针,否则返回空指针
//小于关键字在左子树中继续查找,大于关键字在右子树中继续查找
if(!T || T->key == key)
return T; //查找结束
else if(T->key > key)
return SearchBST(T->lchild,key);
else
return SearchBST(T->rchild,key);
}
二叉排序树的插入
二叉排序树是一种动态树表。其特点是:
- 树的结构通常不是一次生成的,而是在查找的过程中,当 不存在关键字等于给定值的结点时在进行插入。
- 新插入的结点一定是叶子,并且是查找不成功时查找路径 上最后一个结点的左子女或右子女。
//插入操作
int SearchBST(BiTree T, int key, BiTree &p)
{//查找成功,指针p指向该数据元素结点,并返回1;
//查找不成功,指针p指向查找路径上访问的最后一个结点,并返回0。
if(!T)
return 0; //查找不成功
else if(T->key == key)
{
p = T;
return 1; //查找成功
}
else if(T->key > key)
{
p = T;
return SearchBST(T->lchild,key, p);
}
else
{
p = T;
return SearchBST(T->rchild,key, p);
}
}
int InsertBST(BiTree &T, int key)
{//当二叉排序树T中不存在关键字等于key的元素时,插入key并返回1,否则返回0
BiTree p, q;
p = NULL;
if(SearchBST(T,key,p) == 1)
return 0;
q = (BiTree)malloc(sizeof(BTree));
q->key = key;
q->lchild = NULL;
q->rchild = NULL;
if(p == NULL)
T = q;
else if(p->key > key)
p->lchild = q;
else
p->rchild = q;
return 1;
}