用折半查找数组中是否有某个元素效率是很高的,它是通过定义左右两个下标,每次用数组中间的元素与要找的元素进行大小比较,若不相等,则修改左下标,或者右下标,以此类推当左下标小于等于右下标时一直循环查找。

方法一:

注意:

(1)注意形参和实参对应的写法区别

(2)为了使返回结果比较难集中,用if-else语句写在一起

(3)注意防止俩个元素相加结果溢出的处理

(4)折半查找只适应于大小有序的数组

#include <stdio.h>
int bin_search (int key,  int arr[],  int sz)  //定义函数三个形参,要查找的数、数组、数组长度
{int mid=0,left=0;int right=sz-1;  //由于在函数内部不能使用sizeof关键字直接计算数组长度,所以数组长度得单独传进来while(left<=right)  //数组左下标小于等于右下标,查找不停止{mid=(left/2)+(right/2);if(arr[mid]<key)  //若中间的元素小于要查找的元素,则把mid+1赋值给左下标{left=mid+1;}else if(arr[mid]>key)  //若中间的元素大于要查找的元素,则把mid-1赋值给右下标{right=mid-1;}else   //否则就是相等,则立即跳出循环{break;}}if(left>right)  //判断是查找成功跳出还是while循环结束跳出{printf("查找失败!");}else   //{printf("查找成功!");}
}
int main ()
{int arr[]={1,2,3,4,5,6,7,8};int key=5;int sz=sizeof(arr)/sizeof(arr[0]);//计算数组长度,传进去bin_search(key, arr, sz);  //调用二分查找函数return 0;
}

方法二:

这一种和上一种的主要区别是最终结果返回在原函数(二分查找函数),还是主函数,如果是主函数,则在调用原函数值的时候,给定一个返回值,再判断。此外,这种方

法比较通用,就是查找区间可以任意来改变,不像上一种,就是查找在一个数组中的某个元素。

注意:

(1)返回结果没有直接在原函数中,而是在主函数中,则调用原函数时应该将函数返回值保存在一个变量中,再根据这个变量值判断是否查找成功

(2)其它细节上的问题与上一种基本一样

(3)查找范围可以变化,通用性比较强

#include <stdio.h>
int bin_search (int key,  int arr[],  int left,  int right)  //定义函数四个形参,要查找的数、数组、左右下标
{  int mid=0;  while(left<=right)  //数组左下标小于等于右下标,查找不停止  {  mid=(left/2)+(right/2);  if(arr[mid]<key)  //若中间的元素小于要查找的元素,则把mid+1赋值给左下标  {  left=mid+1;  }  else if(arr[mid]>key)  //若中间的元素大于要查找的元素,则把mid-1赋值给右下标  {  right=mid-1;  }  else   //否则就是相等,则立即跳出循环  {  break;  }  }  if(left>right)  //判断是查找成功跳出还是while循环结束跳出  {  return -1;  }  else   //  {  return mid;  }
}
int main ()
{  int arr[]={1,2,3,4,5,6,7,8};  int key=2;  int sz=sizeof(arr)/sizeof(arr[0]);//计算数组长度,  int ret=bin_search(key, arr, 3, 6);  //调用二分查找函数,并且补上实参  if(ret==-1)  //通过看原函数返回值判断是否查找成功  {  printf("no\n");  }  else  {  printf("yes\n");  }  return 0;
}  

【笔记】用函数实现折半查找相关推荐

  1. 折半查找函数(from 《The C Programming Language》)

    该函数用于判定已排序的数组array中是否存在某个特定的值value.这里假定数组元素以升序排列,如果数组array中包含value,则函数返回value在array中的位置(介于0~n-1之间的一个 ...

  2. 题7.15:要求输入一个职工号,用折半查找法查找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。按职工号由小到大顺序排序,姓名顺序也随之调整

    题目 本题是谭浩强<C程序设计课后习题>题7.15. 题目: 写几个函数: 1.输入10个职工的姓名和职工号. 2.按职工号由小到大顺序排序,姓名顺序也随之调整 3.要求输入一个职工号,用 ...

  3. 408数据结构学习笔记——顺序查找、折半查找、分块查找

    目录 1.顺序查找 1.1.顺序查找的概念 1.2.顺序查找的代码 1.3.顺序查找的查找效率 1.4.顺序查找的优化 1.5.顺序表的时间复杂度 2.折半查找 2.1.折半查找的概念 2.2.折半查 ...

  4. 写几个函数: ①输入10个职工的姓名和职工号; ②按职工号由小到大顺序排序,姓名顺序也随之调整; ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。

    写几个函数: ①输入10个职工的姓名和职工号: ②按职工号由小到大顺序排序,姓名顺序也随之调整: ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名. #i ...

  5. java学习笔记之折半查找法(二分法)

    2019独角兽企业重金招聘Python工程师标准>>> package Xhe.com; //折半查找法(二分法) public class halfSearch {     pub ...

  6. 【数据结构----笔记1】查找算法之【顺序查找和折半查找】

    #include<iostream> #include<Windows.h> using namespace std;typedef int ElemType; /*_____ ...

  7. 数据结构笔记(三十一)--折半查找

    折半查找 顺序查找的算法简单,但是平均查找长度较大,特别不适用于较大的查找表 其查找查找的平均长度为(1+n)/2 1.折半查找举例及总结 2.折半查找伪代码 折半查找是分治类算法可以用递归来实现 3 ...

  8. c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...

    折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 折半查找算法 对静态查找表{5,13,19,21,37,56, ...

  9. 每日C语言(The 7th day)——折半查找法

    太久没有更新了,偷懒了,趁着开学前多发几篇(偷笑) 老样子先上题目 T(题目):假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值.找到则 ...

  10. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

最新文章

  1. 华为鸿蒙手机官网价格表,曝下半年华为将推出两款鸿蒙手机:国内独享,价格良心...
  2. 曾经用过的Sql Server分页方法小结
  3. jquery刷新iframe页面的方法(兼容主流)
  4. 查看LINUX当前负载
  5. 【Socket网络编程】17. recv() 函数详解
  6. Windows环境:VMware下linux虚拟机与Windows主机进行文件共享的方法
  7. php打印矩阵,PHP实现顺时针打印矩阵(螺旋矩阵)的方法示例
  8. 计算机教育调查报告,关于计算机类的教育实习调查报告
  9. HPU--1091 N!的位数
  10. INADDR_ANY的确切含义
  11. [HAOI 2012]音量调节
  12. QT5.9.9安装教程
  13. python中abs函数是什么意思_python abs函数怎么用
  14. C# winform对话框用法大全
  15. Unity 知识点 - 3D游戏 - 视角跟随和键盘移动
  16. 关于actor模型的优缺点分析
  17. python定积分1002无标题_python 求定积分和不定积分
  18. 【软考系统架构设计师】2009年下系统架构师综合知识历年真题
  19. C#获取企业微信打卡数据
  20. K12563 输出树的广度优先遍历序列

热门文章

  1. javascript根据浏览器userAgent判断浏览器类型
  2. .net 基于wkhtmltopdf插件,Rotativa包在后端根据html代码生成pdf文件
  3. 基于Unity3D的PCAndroid端2D横屏冒险类闯关游戏
  4. 上线啦,可以定时周期性提醒群成员的机器人
  5. 计算机开机连不上网,我家电脑有时候开机为什么连不上网,重启以后就好?
  6. 微信可以设置雪花昵称了,真漂亮!
  7. dameonset 重启_安装Daemon Tools反复重启的解决方法
  8. 国产MCU替代STM8S003方案汇总
  9. 计算机视觉论文-2021-09-06
  10. 蓝天热键驱动_创建快捷方式或热键以立即弹出特定的USB驱动器