目录
一、线性表的查找
1、顺序查找
2、折半查找
这里有两种实现方法,一种是迭代,一种是递归。
2.1 迭代方法
#include<stdio.h>
#define N 10
typedef struct{
int data[N];
int length;
}nums;
int Seach_bin(nums a, int key)
{
int left = 0;
int right = a.length;
int mid;
while(left <= right){
mid = (left + right) / 2;
if(a.data[mid] == key) // 找到返回mid + 1
return mid + 1;
if(key < a.data[mid]) // mid位置的值比key大,则key应该在左侧
right = mid - 1;
else // mid位置的值比key小,则key应该在右侧
left = mid + 1;
}
return -1; // 没有找到,返回-1
}
int main()
{
nums a;
for(int i = 0;i < 10;i++) // 此处按照升序存储
a.data[i] = i + 1;
a.length = 10;
int key = 6;
int loc = Seach_bin(a,key);
printf("%d\n",loc);
return 0;
}
2.2 递归方法
#include<stdio.h>
#define N 10
typedef struct{
int data[N];
int length;
}nums;
int Seach_bin(nums a, int key, int left, int right){
int mid = (left + right) / 2;
if(left > right) // 超出范围,查找失败
return -1;
else if(key < a.data[mid]) // mid位置的值比key大,则key应该在左侧
return Seach_bin_digui(a, key, left, mid - 1);
else if(key > a.data[mid]) // mid位置的值比key小,则key应该在右侧
return Seach_bin_digui(a, key, mid + 1, right);
else // 查找成功,返回mid + 1
return mid + 1;
}
int main()
{
nums a;
for(int i = 0;i < 10;i++) // 此处按照升序存储
a.data[i] = i + 1;
a.length = 10;
int key = 6;
int loc = Seach_bin(a, key, 0, a.length - 1);
printf("%d\n",loc);
return 0;
}
3、分块查找(索引顺序查找)
4、三种查找方法比较
二、树表的查找
前面的几种查找方法,当表插入、删除操作频繁时,为维护表的有序性,需要移动表中很多记录。
那么,这节来学习下面的方法。
1、二叉排序树
1.1 二叉排序树的定义
1.2 二叉排序树的存储结构
1.3 二叉排序树的递归查找算法
1.4 二叉排序树算法的分析
1.5 二叉排序树的操作
2、平衡二叉树
2.1 平衡二叉树的定义
2.2 失衡二叉排序树的分析与调整
当我们在一个平衡二叉排序树上插入一个结点时,有可能导致失衡,即出现平衡因子绝对值大于1的结点,如: 2、-2。如果在一棵AVL树中插入一个新结点后造成失衡,则必须重新调整树的结构,使之恢复平衡。
(1)LL型调整
(2)RR型调整
(3)LR型调整
(4)RL型调整
如下例子:
三、散列查找
1、相关介绍
散列构造方法:
2、处理冲突的方法
2.1 开放定址法 (开放地址法)
线性探测法:
二次探测法:
伪随机探测法:
2.2 链地址法(拉链法)
3、散列表查找