从小到大排列的有序序列。折半查找的算法描述如下:

将待查找元素与表中间的元素进行比较,如果两者相等,则说明查找成功;否则利用中间位置将表分成两部分,如果待查找元素小于中间位置的元素值,则继续与前一个子表的中间位置元素记性比较;否则与后一个子表的中间位置元素进行比较。不断重复上述操作,直到找到与待查找元素相等的元素,表明查找成功。如果子表为空表,表明查找失败。

【示例】

一个有序顺序表为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——折半查找相关推荐

  1. 数据结构之查找算法:折半查找

    查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...

  2. 查找算法:折半查找算法实现及分析

    折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...

  3. 二分查找算法(折半查找算法)

    二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...

  4. 【查找算法】折半查找法

    本篇文章将介绍折半查找算法. 文章目录 何为折半查找? 算法实现 递归实现 效率分析 何为折半查找? 上一篇文章介绍了顺序查找算法,我们知道,虽然顺序查找算法适用性高,但效率太低,那么能不能在此基础上 ...

  5. 【查找算法】折半查找算法

    ​ 零.写在前面 CSDN21天学习挑战赛 本人蒟蒻一枚,文章若有不足之处请大家批评指出,欢迎大家留言. 活动地址:CSDN21天学习挑战赛 文章目录 零.写在前面 一.算法是什么? 二.折半查找算法 ...

  6. 二分法查找算法(折半查找算法)

    二分法查找又叫折半法查找算法,就是在有序的数组内,找到特指的一个值.这里要注意有序,无序的话只能一个一个找了,正是因为有序,为了使程序跑的快,高效才有的二分法查找算法. 逻辑:(默认从小到大的顺序)指 ...

  7. 递归与分治——二分查找算法(折半查找算法)

    二分搜索主要解决的问题是确定排序后的数组中是否包含目标元素val. 二分搜索通过持续跟踪数组中包含元素val的范围.分为两个过程,第一就是找到了,第二个就是没找到: 一开始,这个范围是整个数组,然后通 ...

  8. 修改折半查找算法进行范围查找

    /*************************************** *修改折半查找算法进行范围查找  ***************************************/ # ...

  9. 经典算法 之 折半查找 python实现

    ​ ​ 活动地址:CSDN21天学习挑战赛 折半查找 1.查找算法 基本概念 不同查找算法分类 2. 折半查找 伪代码 算法评价 3. 算法实践(Python) 折半查找 参考 1.查找算法 查找(S ...

最新文章

  1. 如何使用代码美化器Uncrustify (How to use code beautifier Uncrustify)
  2. android锁屏唤醒并解锁屏幕
  3. JZOJ 5905. 【NOIP2018模拟10.15】黑暗之魂(darksoul)
  4. 机器学习基础(1)——绪论
  5. 第七章 脚本参数的传递
  6. dylib java_将dylib库嵌入macOS应用的方法
  7. C#生成Excel报表 用MyXls组件生成更完美
  8. Angular 为什么要引入 injection token 的概念
  9. eos 编译笔记(注意点)
  10. python做界面用什么软件好_pyqt | 做一个好用的图形界面软件
  11. MyBatis 【中文编码问题】
  12. 贪心算法--经典问题(java实现)
  13. 是西电梦了我,还是我梦了西电
  14. 学习笔记二:接口与继承(内部类)
  15. 《算法竞赛中的初等数论》(一)正文 0x00整除、0x10 整除相关(ACM / OI / MO)(十五万字符数论书)
  16. IP网络主动测评系统——X-Vision
  17. 服务器与pc机的区别
  18. Asterisk模拟卡的FXO(外线)和FXS(内线)端口详解
  19. win2008sever CA证书颁发服务器部署
  20. Tita 绩效宝:经理一对一会议简介

热门文章

  1. 1-4 李宏毅2021春季机器学习教程-PyTorch教学-助教许湛然
  2. C++类、结构体、函数、变量等命名规则详解
  3. 滴滴客服解决方案平台建设实践
  4. 使用UEFI BIOS Updater(UBU)来更新CPU微代码
  5. ubuntu 安裝 jdk 6 遇到的問題
  6. Android程序的升级
  7. python 算法教程 pdf 英文_上手实践《Python机器学习第2版》PDF中文+PDF英文+代码+Sebastian...
  8. 大连理工优化方法matlab,大连理工大学庞丽萍最优化方法matlab程序.doc
  9. U9二次开发之BE插件开发
  10. Linux下察看swap分区大小及增加分区大小