7.2 顺序查找和折半查找
7.2.1 顺序查找
1.一般线性表的顺序查找(引用哨兵的方式)算法如下:
typedef struct{ //查找表的数据结构
ElemType *elem; //元素存储空间基址,建表时按实际长度分配,0号单元留空
int TableLen; //表的长度
}SSTable;
int Search_Seq(SSTable ST,ElemType key){
ST.elem[0]=key; //哨兵
for(int i=ST.TableLen;ST.elem[i]!=key;--i); //从后往前找
return i; //若表中不存在关键字为key的元素,将查找到i为0时退出for循环
}
7.2.2折半查找(二分查找)
二分查找仅适用于有序的顺序表,算法如下:
int Binary_Search(SSTable L,ElemType key){
int low=0,high=L.TableLen-1,mid;
while(low<=high){
mid=(low+high)/2; //取中间位置
if(L.elem[mid]==key)
return mid; //查找成功则返回所在位置
else if(L.elem[mid]>key)
high=mid-1; //从前半部分继续查找
else
low=mid+1; //从后半部分继续查找
}
return -1; //查找失败,返回-1
}
7.2.3 分块查找
7.3 树型查找
7.3.1 二叉排序树(二叉查找树)(BST)
1.二叉排序树的定义
2.二叉排序树的查找
二叉排序树的非递归查找算法:
BSTNode *BST_Search(BiTree T,ElemType key){
while(T!=NULL&&key!=T->data){ //若树空或等于根节点值,则结束循环
if(key<T->data) T=T->lchild; //小于,则在左子树上查找
else T=T->rchild; //大于,则在右子树上查找
}
return T;
}
3.二叉排序树的插入
二叉排序树插入操作的算法描述如下:
int BST_Insert(BiTree &T,KeyType k){
if(T=NULL){ //原树为空,新插入的记录为根节点
T=(BiTree)malloc(sizeof(BSTNode));
T->data=k;
T->lchild=T->rchild=NULL;
return 1; //返回1,插入成功
}
else if(k==T->data) //树中存在相同关键字的节点,插入失败
return 0;
else if(k<T->data) //插入到T的左子树
return BST_Insert(T->lchild,k);
else //插入到T的右子树
return BST_Insert(T->rchild,k);
}
4.二叉排序树的构造
构造二叉排序树的算法描述如下:
void Creat_BST(BiTree &T,KeyType str[],int n){
T=NULL; //初始时T为空树
int i=0;
while(i<n){ //依次将每个关键字插入到二叉排序树中
BST_Insert(T,str[i]);
i++;
}
}
5.二叉排序树的删除
7.3.2 平衡二叉树
1.平衡二叉树的定义
定义结点左子树和右子树的高度差为该节点的平衡因子,则平衡二叉树结点的平衡因子的值只可能是-1、0或1。
2.平衡二叉树的插入
(1)LL平衡旋转(右单旋转)
(2)RR平衡旋转(左单旋转)
(3)LR平衡旋转(先左后右双旋转)
(4)RL平衡旋转(先右后左双旋转)
3.平衡二叉树的删除
7.3.3 红黑树
1.红黑树的定义
红黑树性质:左根右,根叶黑,不红红,黑路同
2.红黑树的插入
红黑树的插入过程举例如下所示:
3.红黑树的删除
红黑树的删除操作难,举个例子说明一下:
7.4 B树和B+树
7.4.1 B树及其基本操作
1.B树的高度(磁盘存取次数)
3.B树的插入
4.B树的删除
7.4.2 B+树的基本概念
7.5 散列表
7.5.1 散列表的基本概念
7.5.2 散列函数的构造方法
7.5.3 处理冲突的方法