查找是指在大量的信息中寻找一个特定的信息。在计算机中,查找是非常重要的一个应用,比如“百度”。查找算法的好坏直接影响查找的速度。

常用的查找算法主要有顺序查找和折半(二分法)查找:

顺序查找是指从数组的一端开始逐个进行比较,直到找到该数据为止。

折半查找是指在已经排好序的一组数据中快速查找数据。

现实编程中,数据一般都是有序的。即使刚开始是无序的,但存储到数据库中时都是先将它们排好序然后再放进去,这样在实际应用中才能更方便。

顺序查找

查找数组 a 中第一次出现数字 m 的下标并输出该下标,如果没有则输出“sorry”,实现代码如下:

# include

int main(void)

{

int a[] = {1,5,66,8,55,9,1,32,5,65,4,8,5,15,64,156,1564,15,1,8,9,7,215,

16,45,5,6,164,15,236,2,5,55,6,4,1,59,23,4,5,314,56,15,3,54,

1,54,54,2,4,4,5,15,698,486,56,26,98,78,456,1894,564,26,56,5};

int n; //存放数组a中元素的个数

int m; //查找的数字

int i; //循环变量

n = sizeof(a) / sizeof(int); //求出数组中所有元素的个数

printf("请输入一个数字:");

scanf("%d", &m);

for (i=0; i

{

if (a[i] == m)

{

printf("下标 = %d\n", i);

break;

}

}

if (i == n)

{

printf("sorry\n");

}

return 0;

}

输出结果是:

请输入一个数字:7

下标 = 21

请输入一个数字:58

sorry

折半查找

折半查找是很有意思的,它的算法复杂度非常低,但它要求数据必须是已经排好序的。比如数组 a 中:

13 45 78 90 127 189 243 355

现在看看怎么用折半算法在其中查找 243。

1) 先定义一个变量 key 用于存放要查找的 243:

key = 243

2) 定义变量 low、mid和high 分别存储数组的最小下标、中间下标和最大下标。并有:

mid = (low+high)/2 = (0+7)/2 = 3

3) 此时 a[3]=90,而 key>90,说明 243 在 90 的右边,则往后查找:

low = mid + 1 = 4

4) 然后重新更新 mid:

mid = (4+7)/2 = 5

5) 此时 a[5]=189,而 key>189,说明 243 在 189 的右边,继续往后查找:

low = mid+1 = 6

6) 然后重新更新 mid:

mid = (6+7)/2 = 6

7) 此时 a[6]=key=243,找到了。

下面再来怎么查找 78:

1) key=78,mid=(low+high)/2=(0+7)/2=3。

2) 此时 a[3]=90,而 key<90,说明 78 在 90 的左边,则往前查找:

high = mid-1 = 2

3) 然后重新更新 mid:

mid = (0+2)/2 = 1

4) 此时 a[1]=45,而 key>45,说明 78 在 45 的右边,则往后查找:

low = 1+1 = 2

5) 然后重新更新 mid:

mid = (2+2)/2 = 2

6) 此时 a[2]=key=78,就找到了。

若所查找的在数据序列中没有呢?比如查找 123:

1) key=123,mid=(low+high)/2=(0+7)/2=3。

2) 此时 a[3]=90,而 key>90,说明 123 在 90 的左边,则往后查找:

low = mid+1 = 4

3) 然后重新更新 mid:

mid = (4+7)/2 = 5

4) 此时 a[5]=189,而 key<189,说明 123 在 189 的左边,则往前查找:

high=mid-1=4。

5) 此时 low==high,如果该数仍不是要找的数的话,说明该序列中就没有该数了。

下面将这个程序写下来:

# include

int main(void)

{

int a[] = {13, 45, 78, 90, 127, 189, 243, 355};

int key; //存放要查找的数

int low = 0;

int high = sizeof(a)/sizeof(a[0]) - 1;

int mid;

int flag = 0; //标志位, 用于判断是否存在要找的数

printf("请输入您想查找的数:");

scanf("%d", &key);

while ((low <= high))

{

mid = (low + high) / 2;

if (key < a[mid])

{

high = mid - 1;

}

else if (a[mid] < key)

{

low = mid +1;

}

else

{

printf("下标 = %d\n", mid);

flag = 1;

break;

}

}

if (0 == flag)

{

printf("sorry, data is not found\n");

}

return 0;

}

输出结果是:

请输入您想查找的数:78

下标 = 2

请输入您想查找的数:123

sorry, data is not found

折半查找在每次查找时都排除了一半数据,所以它的效率是非常高的。顺序查找的平均查找长度为 n+1/2,而折半查找的平均查找长度为 log2(n+1)-1。可见使用折半查找时,数据数量越多查找效率就越高。

但是,折半查找只适合数组,不适合链表。链表中也可以用折半查找,但是不仅不会提高效率,反而还会降低效率。因为数组可以通过下标直接找到 low、mid 和 high 对应的元素,而链表是通过指针连接起来的不连续的链,所以若要查找 low、mid 和 high 对应的元素,每次都要从第一个结点出发一个一个往后找。所以一般不在链表内使用折半查找。

python二分法查找算法_顺序查找算法和折半(二分法)查找算法,C语言查找算法详解...相关推荐

  1. 数学速算法_新初一】七年级上册数学几何图形初步知识点梳理+例题详解!

    几何图形初步知识网络:知识点梳理背诵1. 我们把实物中抽象的各种图形统称为几何图形. 2.有些几何图形(如长方体.正方体.圆柱.圆锥.球等)的各部分不都在同一平面内,它们是立体图形. 3.有些几何图形 ...

  2. 蓝桥杯青少年创意编程python初级考察内容_第十一届蓝桥杯青少年创意编程scratch初级组编程题详解...

    点击上方"启迪少儿"即可关注 今年的12月15日是第十一届蓝桥杯青少赛的第二次选拔赛,安徽.北京.福建.广东.广西.河北.黑龙江.湖南.吉林.江苏.江西.辽宁.宁夏.山西.陕西.四 ...

  3. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  4. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(十) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  5. python语言的格式框架_django框架模板语言使用方法详解

    本文实例讲述了django框架模板语言使用方法.分享给大家供大家参考,具体如下: 模板功能 作用:生成html界面内容,模版致力于界面如何显示,而不是程序逻辑.模板不仅仅是一个html文件,还包括了页 ...

  6. [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  8. python目标识别算法_深度学习目标检测系列:一文弄懂YOLO算法|附Python源码

    摘要: 本文是目标检测系列文章--YOLO算法,介绍其基本原理及实现细节,并用python实现,方便读者上手体验目标检测的乐趣. 在之前的文章中,介绍了计算机视觉领域中目标检测的相关方法--RCNN系 ...

  9. java jvm垃圾回收算法_深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法

    本文转自互联网,侵删 本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 喜欢的话麻烦点下Star哈 文章将同步到我的个人博客: www.how ...

最新文章

  1. java jni key_JNIKeyProtection
  2. linux 安装软件出现/tmp 磁盘不足时 解决方案
  3. GLSL. 语法基础
  4. @ConfigurationProperties 注解
  5. Python学习笔记:错误,测试,调试(起)
  6. c语言exit_看了这几个C语言例子,你一定会说5个哇塞,声音一次比一次大
  7. Web开发之一:Web UI技术综述
  8. java图像处理001---图像合成_java实现雨滴头像效果_可以放在地图上使用_自动生成雨滴头像
  9. oracle中 initcpa,oracle  11g rman备份
  10. 指定某个git的版本代码拉取新的分支
  11. 基于jQuery的视频和音频播放器jPlayer
  12. matlab 排序 sorttrows
  13. 过程装备安装调试实训装置
  14. word排版学习笔记
  15. python做项目看板_基于pyecharts搭建BI看板
  16. 人脸识别门禁应用方案
  17. educoder 2-2Python 计算思维训练——循环与列表(二)
  18. Am3358增加Uboot的logo显示 增加Uboot自定义命令控制LCD
  19. Neo4j 4.x 社区版数据导入及Spring-Data-Neo4j 5.x、6.x使用案例
  20. Java:集合类性能分析

热门文章

  1. apache安装_Apache+PHP 安装 ---windows
  2. 数据结构与算法常用名词术语整理
  3. Ubuntu 14.04 64bit上使用IPython玩转Docker
  4. 哈希表的分类,创建,查找 以及相关问题解决
  5. 使用内存盘 格式化文件系统以及部署ceph-osd
  6. on-my-zsh git 仓库下运行卡顿
  7. PHPMailer类 发送邮件
  8. Mininet的介绍安装
  9. Yii 错误页面处理
  10. asp.net提交危险字符处理方法之一