【笔记】用函数实现折半查找
用折半查找数组中是否有某个元素效率是很高的,它是通过定义左右两个下标,每次用数组中间的元素与要找的元素进行大小比较,若不相等,则修改左下标,或者右下标,以此类推当左下标小于等于右下标时一直循环查找。
方法一:
注意:
(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;
}
【笔记】用函数实现折半查找相关推荐
- 折半查找函数(from 《The C Programming Language》)
该函数用于判定已排序的数组array中是否存在某个特定的值value.这里假定数组元素以升序排列,如果数组array中包含value,则函数返回value在array中的位置(介于0~n-1之间的一个 ...
- 题7.15:要求输入一个职工号,用折半查找法查找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。按职工号由小到大顺序排序,姓名顺序也随之调整
题目 本题是谭浩强<C程序设计课后习题>题7.15. 题目: 写几个函数: 1.输入10个职工的姓名和职工号. 2.按职工号由小到大顺序排序,姓名顺序也随之调整 3.要求输入一个职工号,用 ...
- 408数据结构学习笔记——顺序查找、折半查找、分块查找
目录 1.顺序查找 1.1.顺序查找的概念 1.2.顺序查找的代码 1.3.顺序查找的查找效率 1.4.顺序查找的优化 1.5.顺序表的时间复杂度 2.折半查找 2.1.折半查找的概念 2.2.折半查 ...
- 写几个函数: ①输入10个职工的姓名和职工号; ②按职工号由小到大顺序排序,姓名顺序也随之调整; ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名。
写几个函数: ①输入10个职工的姓名和职工号: ②按职工号由小到大顺序排序,姓名顺序也随之调整: ③要求输入一个职工号,用折半查找法找出该职工的姓名,从主函数输入要查找的职工号,输出该职工姓名. #i ...
- java学习笔记之折半查找法(二分法)
2019独角兽企业重金招聘Python工程师标准>>> package Xhe.com; //折半查找法(二分法) public class halfSearch { pub ...
- 【数据结构----笔记1】查找算法之【顺序查找和折半查找】
#include<iostream> #include<Windows.h> using namespace std;typedef int ElemType; /*_____ ...
- 数据结构笔记(三十一)--折半查找
折半查找 顺序查找的算法简单,但是平均查找长度较大,特别不适用于较大的查找表 其查找查找的平均长度为(1+n)/2 1.折半查找举例及总结 2.折半查找伪代码 折半查找是分治类算法可以用递归来实现 3 ...
- c语言指针的折半法查找,数据结构笔记7:折半查找法(二分查找法)及C语言实现...
折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高.但是该算法的使用的前提是静态查找表中的数据必须是有序的. 折半查找算法 对静态查找表{5,13,19,21,37,56, ...
- 每日C语言(The 7th day)——折半查找法
太久没有更新了,偷懒了,趁着开学前多发几篇(偷笑) 老样子先上题目 T(题目):假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值.找到则 ...
- 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第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 第 ...
最新文章
- 华为鸿蒙手机官网价格表,曝下半年华为将推出两款鸿蒙手机:国内独享,价格良心...
- 曾经用过的Sql Server分页方法小结
- jquery刷新iframe页面的方法(兼容主流)
- 查看LINUX当前负载
- 【Socket网络编程】17. recv() 函数详解
- Windows环境:VMware下linux虚拟机与Windows主机进行文件共享的方法
- php打印矩阵,PHP实现顺时针打印矩阵(螺旋矩阵)的方法示例
- 计算机教育调查报告,关于计算机类的教育实习调查报告
- HPU--1091 N!的位数
- INADDR_ANY的确切含义
- [HAOI 2012]音量调节
- QT5.9.9安装教程
- python中abs函数是什么意思_python abs函数怎么用
- C# winform对话框用法大全
- Unity 知识点 - 3D游戏 - 视角跟随和键盘移动
- 关于actor模型的优缺点分析
- python定积分1002无标题_python 求定积分和不定积分
- 【软考系统架构设计师】2009年下系统架构师综合知识历年真题
- C#获取企业微信打卡数据
- K12563 输出树的广度优先遍历序列
热门文章
- javascript根据浏览器userAgent判断浏览器类型
- .net 基于wkhtmltopdf插件,Rotativa包在后端根据html代码生成pdf文件
- 基于Unity3D的PCAndroid端2D横屏冒险类闯关游戏
- 上线啦,可以定时周期性提醒群成员的机器人
- 计算机开机连不上网,我家电脑有时候开机为什么连不上网,重启以后就好?
- 微信可以设置雪花昵称了,真漂亮!
- dameonset 重启_安装Daemon Tools反复重启的解决方法
- 国产MCU替代STM8S003方案汇总
- 计算机视觉论文-2021-09-06
- 蓝天热键驱动_创建快捷方式或热键以立即弹出特定的USB驱动器