C语言 二分法查找与递归二分法查找
1.二分法查找
1、算法:二分法查找适用于数据量较大时,但是数据需要先排好顺序
2、主要思想是: (设查找的数组区间为arraylow, high]) 确定该区间的中间位置K。将查找的值T与array[k]比较。若相等,查找成功返回此位置,否则确定新的查找区域,继续二分查找。区域确定如下: a.array[k]>T 由数组的有序性可知array[k,k+1,......,high]>T;故新的区间为array[low,......,-1]b.array[k]
相关步骤
1.定义3个用来记录索引值的变量,变量min记录当前范围最小索引值,初始值为0;变量max记录当前范围最大索引值,初始值为数组长度-1;变量mid记录当前当前范围最中间元素的索引值,初始值为(min+max) / 2
2.使用循环,判断当前范围下,最中间元素值与指定查找的数值是否相等
若相等,结束循环,返回当前范围最中间元素的索引值mid
若不相等,根据比较结果,缩小查询范围为上一次查询范围的一般
中间元素值 比 要查询的数值大,说明要查询的数值在当前范围的最小索引位置与中间索引位置之间,此时,更新查询范围为:
范围最大索引值 = 上一次中间索引位置 -1;
中间元素值 比 要查询的数值小,说明要查询的数值在当前范围的最大索引位置与中间索引位置之间,此时,更新查询范围为:
范围最小索引值 = 上一次中间索引位置 +1;
在新的查询范围中,更新中间元素值的位置,再次使用最中间元素值与指定查找的数值是否相等。
中间索引值 = (范围最小索引值 +范围最大索引值) / 2;
3.每次查询范围缩小一半后,使用if语句判断,查询范围是否小于0个元素,若小于0个元素,则说明指定数值没有查询到,返回索引值-1。
2.直接二分法查找
#include<stdio.h>
int find(int arr[], int n, int key)
{int low = 0;int high = n - 1;int mid;mid = (low + high) / 2;if (n == 1)//要讨论如果数组只有一个数字就直接返回第一个位置return mid;else {while (low < high){if (arr[mid] > key)low = mid + 1;else if (arr[mid] < key)high = mid - 1;elsereturn mid;//找到了就返回这个数字的位置mid = (low + high) / 2;}}return -1;//找不到返回-1
}
int main()
{int a[100];int n,key;scanf("%d %d", &n, &key);//n个数字for (int i = 0; i < n; i++)scanf("%d", &a[i]);printf("%d", find(a, n, key));
}
3.递归二分法查找
#include<stdio.h>
int find(int a[], int r, int l, int key)
{int mid = 0;while (l<=r)//n=r的时候,有且仅有一个数字,要讨论{mid = (l + r) / 2;if (a[mid] < key)return find(a, r, mid + 1, key);else if (a[mid] > key)return find(a, mid - 1, l, key);elsereturn mid;}return -1;
}
int main()
{int a[100];int n,key;scanf("%d %d", &n,&key);for (int i = 0; i < n; i++)scanf("%d", &a[i]);printf("%d", find(a, n - 1, 0, key));
}
总结:二分法查找的前提是数组是排序好的,否则要进行排序再来二分法查找。递归二分法是比较简单的,让代码简化,但是递归的运输次数是比迭代的要多的。所以我们可以根据需求去选择自己想要的方法
C语言 二分法查找与递归二分法查找相关推荐
- 冒泡排序,递归二分查找法,二分法
#冒泡排序list1=[2,4,5,6,7,8,9,11,30,35,38,41,42] def bubble_sort(list):for i in range(len(list)-1):for j ...
- python 二分查找_Python实现二分法搜索
二分法是一种效率比较高的搜索方法,时间复杂度为 O(log2n) .假设有一个1~100之间的数字,你来猜这个数是多少,每猜一次可以得到三种回答:正确.大了或小了.如何保证用最少的次数猜对?很多人会想 ...
- 查找算法(顺序查找、二分法查找、二叉树查找、hash查找)
查找功能是数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1)顺 ...
- java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...
转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...
- python二分法查找时间点_python有序查找算法:二分法
二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 但是需要注意:待查找的序列区间单调有序 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确 ...
- 查找——顺序、二分法、斐波那契、插值、分块
目录 创建随机数列 顺序查找 二分法查找 斐波那契查找 插值查找 分块查找 创建随机数列 import random import timeit #创建随机的数列,n为数列个数,数列元素在0-1000 ...
- 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)
查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...
- 递归折半查找法 c语言程序,折半查找法的递归和非递归形式
/* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...
- 《数据结构(C语言版)》学习笔记08 查找
目录 写在前面 一.顺序查找 1.1 普通的无序查找方法 1.2 改进的无序查找--哨兵 1.3 有序的顺序查找 二.折半查找/二分查找 三.分块查找 四.二叉搜索树 五.平衡二叉搜索树 六.B树 七 ...
最新文章
- elasticsearch使用指南之Elasticsearch Document Index API详解、原理与示例
- Redis的两种连接方式
- 【机器学习算法-python实现】K-means无监督学习实现分类
- c语言xml字符串,C语言的XML解析器
- PHP十六个魔术方法
- linux基础知识——进程相关概念
- 百度在线解析站不限速下载
- 从零开始学 Web 之 ES6(三)ES6基础语法一
- WPF中退出时显示是否保存数据提示
- git 入门操作指令
- arguments的理解
- webpack模块化原理-ES module
- ubuntu固定内网ip_Ubuntu14设置局域网固定IP
- RPLIDAR思岚雷达学习记录--6--matlab处理雷达数据
- C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集
- C#减少图片文件大小和尺寸(转)
- Flutter基础之部分控件学习
- 华为最懂任正非的人:一人之下、万人之上
- UDN社区 开源文档分类导航
- Android(SpreadTurm)多语言版本电话录音系统报错
热门文章
- RFID人员定位设备具体配置
- error MSB8020 问题解决
- 《互联网信贷风险与大数据》读书笔记(一)
- k8s集群coredns无法解析外部域名
- 腾讯研究院夹缝中生存 35万元年薪难求才
- 上课记录笔记 项目1 文字大乱斗 v0.1
- red hart linux中文,hart是什么意思_hart的翻译_音标_读音_用法_例句_爱词霸在线词典...
- 杭电考研计算机多少分及格,2020考研:杭电计算机好考吗?分数线是多少?
- yarn : 无法加载文件 xxxxxxxxx,因为在此系统上禁止运行脚本。
- 如何反击职场PUA?