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语言 二分法查找与递归二分法查找相关推荐

  1. 冒泡排序,递归二分查找法,二分法

    #冒泡排序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 ...

  2. python 二分查找_Python实现二分法搜索

    二分法是一种效率比较高的搜索方法,时间复杂度为 O(log2n) .假设有一个1~100之间的数字,你来猜这个数是多少,每猜一次可以得到三种回答:正确.大了或小了.如何保证用最少的次数猜对?很多人会想 ...

  3. 查找算法(顺序查找、二分法查找、二叉树查找、hash查找)

    查找功能是数据处理的一个基本功能.数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下.我们假定查找的数据唯一存在,数组中没有重复的数据存在. (1)顺 ...

  4. java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...

    转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...

  5. python二分法查找时间点_python有序查找算法:二分法

    二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 但是需要注意:待查找的序列区间单调有序 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确 ...

  6. 查找——顺序、二分法、斐波那契、插值、分块

    目录 创建随机数列 顺序查找 二分法查找 斐波那契查找 插值查找 分块查找 创建随机数列 import random import timeit #创建随机的数列,n为数列个数,数列元素在0-1000 ...

  7. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  8. 递归折半查找法 c语言程序,折半查找法的递归和非递归形式

    /* 1.折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止. 2.折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊l ...

  9. 《数据结构(C语言版)》学习笔记08 查找

    目录 写在前面 一.顺序查找 1.1 普通的无序查找方法 1.2 改进的无序查找--哨兵 1.3 有序的顺序查找 二.折半查找/二分查找 三.分块查找 四.二叉搜索树 五.平衡二叉搜索树 六.B树 七 ...

最新文章

  1. elasticsearch使用指南之Elasticsearch Document Index API详解、原理与示例
  2. Redis的两种连接方式
  3. 【机器学习算法-python实现】K-means无监督学习实现分类
  4. c语言xml字符串,C语言的XML解析器
  5. PHP十六个魔术方法
  6. linux基础知识——进程相关概念
  7. 百度在线解析站不限速下载
  8. 从零开始学 Web 之 ES6(三)ES6基础语法一
  9. WPF中退出时显示是否保存数据提示
  10. git 入门操作指令
  11. arguments的理解
  12. webpack模块化原理-ES module
  13. ubuntu固定内网ip_Ubuntu14设置局域网固定IP
  14. RPLIDAR思岚雷达学习记录--6--matlab处理雷达数据
  15. C# 调用NationalInstruments的dll报错问题 未能加载文件或程序集
  16. C#减少图片文件大小和尺寸(转)
  17. Flutter基础之部分控件学习
  18. 华为最懂任正非的人:一人之下、万人之上
  19. UDN社区 开源文档分类导航
  20. Android(SpreadTurm)多语言版本电话录音系统报错

热门文章

  1. RFID人员定位设备具体配置
  2. error MSB8020 问题解决
  3. 《互联网信贷风险与大数据》读书笔记(一)
  4. k8s集群coredns无法解析外部域名
  5. 腾讯研究院夹缝中生存 35万元年薪难求才
  6. 上课记录笔记 项目1 文字大乱斗 v0.1
  7. red hart linux中文,hart是什么意思_hart的翻译_音标_读音_用法_例句_爱词霸在线词典...
  8. 杭电考研计算机多少分及格,2020考研:杭电计算机好考吗?分数线是多少?
  9. yarn : 无法加载文件 xxxxxxxxx,因为在此系统上禁止运行脚本。
  10. 如何反击职场PUA?