查找算法:顺序查找&二分查找

查找:在相同类型的记录构成的集合中找出满足给定条件的记录

静态查找 :不涉及插入和删除操作的查找
静态查找只注重查找效率,适用于:
(1)查找集合一经生成,便只对其进行查找,而不进行插入和删除操作
(2)经过一段时间的查找之后,集中地进行插入和删除等修改操作

关键字:数据元素(或记录)中某个数据项的值,用它可以唯一的标识(识别)一个数据元素(或记录)。

查找基于的数据模型是集合

集 合 { 线 性 表 : 适 用 于 静 态 查 找 , 顺 序 查 找 、 折 半 查 找 等 技 术 树 表 : 适 用 于 动 态 查 找 , 二 叉 排 序 树 的 查 找 技 术 散 列 表 : 静 态 查 找 和 动 态 查 找 均 适 用 , 采 用 散 列 技 术 集合\left\{ \begin{array}{rcl} 线性表:适用于静态查找,顺序查找、折半查找等技术\\ 树 表:适用于动态查找,二叉排序树的查找技术 \\ 散列表:静态查找和动态查找均适用,采用散列技术\end{array} \right. 线

平均查找长度:查找算法进行的关键码比较次数的数学期望值
在这里插入图片描述

顺序查找(线性查找)

线性表的一端向另一端逐个将记录与给定值进行比较,若相等,则查找成功,给出该记录在表中的位置;若整个表检测完仍未找到与给定值相等的记录,则查找失败,给出失败信息。

在这里插入图片描述
从前往后进行遍历查找:

int search(int arr[],int n,int x)
{
	int i;
	for (i=0;i<n;i++)
	    if(arr[i]==x)
		   return i;//查找成功返回i
	return 0;//查找失败返回0
}

在这里插入图片描述
从后往前遍历查找:

int search(int arr[],int n,int x)
{
	int i=n-1;
	while (arr[i]!=x)
	{
		i--;
	}
	if (i>=0)
	return i;
	return -1;
}

时间复杂度:
在这里插入图片描述
顺序查找的优缺点:
顺序查找的缺点:查找效率较低
特别是当待查找集合中元素较多时,不推荐使用顺序查找

顺序查找的优点:算法简单而且使用面广
(1)对表中记录的存储没有任何要求,顺序存储和链接存储均可
(2)对表中记录的有序性也没有要求,无论记录是否按关键码有序均可

二分查找法(折半查找法)

1、在有序表(假设为递增)中,取中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于中间记录,则在有序表的左半区继续查找;若给定值大于中间记录,则在有序表的右半区继续查找。不断重复上述过程,直到查找成功,或查找区域无记录,查找失败。
在这里插入图片描述
例:从数组arr[]={7,14,21,28,35,42,49,56,63}中查找21。
在这里插入图片描述
当查找15时,查找区间[3,2],low > high,查找失败。

int Bsearch(int arr[],int low,int high,int x)
{
	int mid,low = 1, high = n;
	while (low<=high)//当子表长度大于等于1时进行循环
	{
		mid=(low+high)/2;//取当前的中间位置
		if (arr[mid]==x)//找到之后返回元素的位置
			return mid;
		else if(arr[mid]>x)//需要从arr[low,...,mid-1]中查找
			high=mid-1;
		else//需要从arr[mid+1,...,high]中查找
			low=mid+1;
	}
	return 0;//查找成功,返回元素序号
	//查找失败返回0
}

2、判定树(折半查找判定树):描述折半查找判定过程的二叉树。

设查找区间是[low, high],判定树的构造方法:
(1)当low>high时,判定树为空;
(2)当low ≤ high时,判定树的根结点是有序表中序号为mid=(low+high)/2的记录,根结点的左子树是与有序表arr[low]~arr[mid-1]相对应的判定树,根结点的右子树是与有序表arr[mid+1] ~ arr[high]相对应的判定树。
在这里插入图片描述
关键:结点的值为该结点在表中的位置
注意:每一个分支结点,均是向下取整的结果

3、查找成功情况下,时间复杂度

  • 折半查找任一记录的过程,即是判定树中从根结点到该记录结点的路径,和给定值的比较次数等于该记录结点在树中的层数。

在这里插入图片描述
4、查找不成功的过程是从根结点到外部结点的路径,和给定值进行的比较次数等于该路径上内部结点的个数。
例:查找第 4 个元素比较多少次?
例:查找比3大比4小的数字。
在这里插入图片描述

  • 查找成功的平均比较次数 = (1×1+2×2+3×4+4×4)/11 = 3
  • 查找不成功的平均比较次数 = (3×4+4×8)/12 = 11/3

查找算法的时间复杂度

顺序查找二分查找
O(n)O(logn)

在这里插入图片描述

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值