查找算法2——折半查找
从小到大排列的有序序列。折半查找的算法描述如下:
将待查找元素与表中间的元素进行比较,如果两者相等,则说明查找成功;否则利用中间位置将表分成两部分,如果待查找元素小于中间位置的元素值,则继续与前一个子表的中间位置元素记性比较;否则与后一个子表的中间位置元素进行比较。不断重复上述操作,直到找到与待查找元素相等的元素,表明查找成功。如果子表为空表,表明查找失败。
【示例】
一个有序顺序表为7,15,22,29,41,55,67,78,81,99,如果要查找的元素为67。利用折半查找算法思想,过程如下。
其中low,high,表示两个指针,分别指向待查找元素的下界和上界,指针mid指向low和high的中间位置,即mid=(low+high)/2。
初始时,low=0,high=9,mig=(0+9)/2=4,因为list[mid]<x,座椅需要在右半区继续寻找。此时low=5,high=9,mid=(5+9)/2=7,因为list[mid]>x,所以需要在左半区继续查找x。此时有low=5,high=6,mid=5,因为list[mid]<x,所以需要在右半区继续找,此时有low=6,high=6,mid=6,list[mid]=x,查找成功。
#include<stdio.h>
#include<iostream>#define MaxSize 100
using namespace std;
typedef struct
{int list[MaxSize];int length;
}Table;
int BinarySearch(Table S, int x);
void main()
{Table T = { { 12,24,36,48,60,72,84,96 },8 };int i, find, x;printf("有序顺序表中的元素:\n");for (i = 0; i<T.length; i++)printf("%4d", T.list[i]);printf("\n请输入要查找的元素:");scanf("%d", &x);find = BinarySearch(T, x);if (find)printf("元素%d是顺序表中的第%d个元素.\n", x, find);elseprintf("没有找到该元素.\n");system("pause");
}
int BinarySearch(Table S, int x)
/*在有序顺序表中折半查找元素x*/
{int low, high, mid;low = 0, high = S.length - 1; /*设置待查找元素范围的下界和上界*/while (low <= high){mid = (low + high) / 2;if (S.list[mid] == x) /*如果找到元素,则返回该元素所在的位置*/return mid + 1;else if (S.list[mid]<x) /*如果mid所指示的元素小于x,则修改low指针*/low = mid + 1;else if (S.list[mid]>x) /*如果mid所指示的元素大于x,则修改high指针*/high = mid - 1;}return 0;
}
结果:
【特点】
*折半查找算法要求待排序的元素必须是一个有序的序列。
*折半搜索查找的算法效率优于顺序查找算法的效率。
【效率分析】
折半查找算法过程可以用一个判定树去描述。例如用折半查找值为56的元素时,需要比较4次。从图中可以看出查找值为41的元素时,需要比较1次。查找值为78的元素时,需要比较2次。查找值为55的元素时,需要比较3次。查找值为67的元素时,需要比较4次。整个查找过程可以用二叉判定树来表示。
其中结点旁边的序号为该元素在序列中的下标。从图中的判定树不难看出,查找元素67的过程正好是从根结点到元素值为67的结点路径。查找元素67的比较次数正好是该元素在判定树种所在层次。因此,如果表中有n个元素,折半查找成功时,最多需要比较的次数为。
对于具有n个结点的有序表(恰好构成一个深度为h的满二叉树)来说,有,二叉树中第i层的结点个数是
。假设表中每个元素的查找概率相等,即
,则有序表在折半查找成功时的平均查找长度为:
查找失败时,有序表的折半查找失败平均查找长度为
查找算法2——折半查找相关推荐
- 数据结构之查找算法:折半查找
查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...
- 查找算法:折半查找算法实现及分析
折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...
- 二分查找算法(折半查找算法)
二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...
- 【查找算法】折半查找法
本篇文章将介绍折半查找算法. 文章目录 何为折半查找? 算法实现 递归实现 效率分析 何为折半查找? 上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上 ...
- 【查找算法】折半查找算法
零.写在前面 CSDN21天学习挑战赛 本人蒟蒻一枚,文章若有不足之处请大家批评指出,欢迎大家留言. 活动地址:CSDN21天学习挑战赛 文章目录 零.写在前面 一.算法是什么? 二.折半查找算法 ...
- 二分法查找算法(折半查找算法)
二分法查找又叫折半法查找算法,就是在有序的数组内,找到特指的一个值.这里要注意有序,无序的话只能一个一个找了,正是因为有序,为了使程序跑的快,高效才有的二分法查找算法. 逻辑:(默认从小到大的顺序)指 ...
- 递归与分治——二分查找算法(折半查找算法)
二分搜索主要解决的问题是确定排序后的数组中是否包含目标元素val. 二分搜索通过持续跟踪数组中包含元素val的范围.分为两个过程,第一就是找到了,第二个就是没找到: 一开始,这个范围是整个数组,然后通 ...
- 修改折半查找算法进行范围查找
/*************************************** *修改折半查找算法进行范围查找 ***************************************/ # ...
- 经典算法 之 折半查找 python实现
活动地址:CSDN21天学习挑战赛 折半查找 1.查找算法 基本概念 不同查找算法分类 2. 折半查找 伪代码 算法评价 3. 算法实践(Python) 折半查找 参考 1.查找算法 查找(S ...
最新文章
- 如何使用代码美化器Uncrustify (How to use code beautifier Uncrustify)
- android锁屏唤醒并解锁屏幕
- JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
- 机器学习基础(1)——绪论
- 第七章 脚本参数的传递
- dylib java_将dylib库嵌入macOS应用的方法
- C#生成Excel报表 用MyXls组件生成更完美
- Angular 为什么要引入 injection token 的概念
- eos 编译笔记(注意点)
- python做界面用什么软件好_pyqt | 做一个好用的图形界面软件
- MyBatis 【中文编码问题】
- 贪心算法--经典问题(java实现)
- 是西电梦了我,还是我梦了西电
- 学习笔记二:接口与继承(内部类)
- 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
- IP网络主动测评系统——X-Vision
- 服务器与pc机的区别
- Asterisk模拟卡的FXO(外线)和FXS(内线)端口详解
- win2008sever CA证书颁发服务器部署
- Tita 绩效宝:经理一对一会议简介
热门文章
- 1-4 李宏毅2021春季机器学习教程-PyTorch教学-助教许湛然
- C++类、结构体、函数、变量等命名规则详解
- 滴滴客服解决方案平台建设实践
- 使用UEFI BIOS Updater(UBU)来更新CPU微代码
- ubuntu 安裝 jdk 6 遇到的問題
- Android程序的升级
- python 算法教程 pdf 英文_上手实践《Python机器学习第2版》PDF中文+PDF英文+代码+Sebastian...
- 大连理工优化方法matlab,大连理工大学庞丽萍最优化方法matlab程序.doc
- U9二次开发之BE插件开发
- Linux下察看swap分区大小及增加分区大小