用自定义函数,实现二分查找算法。

  1. 二分查找算法也叫折半查找,用来查找有序整数数组内容的一种算法,最大查找次数是log以2为底n次方(n为数组的元素总数),算法思想:每次取数组下标的中间值,然后查找下标对应的值对比查找数的大小,然后确定第二次查找范围,再取中间下标,再对比下标所对应的值和想查找的值,一直循环,直到下标对应值与查找值相同。

  2. 注:二分查找只适用于有序整数数组。有序1,2,3,4,5…连续的数字(不限定开始数字)

  3. 什么是数组:C语言数组属于构造数据类型。一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别,如。
    4.定义函数思想:实现查找,找到返回数组下标值,找不到返回-1.

int arr[]={0,1,2,3};
//int 代表数组类型。
//arr代表数组名字;
//[]代表数组大小,可以不写,系统默认会识别大小,然后向内存申请空间。
//{}代表类型的元素,不同元素用","隔开。

注意:数组类型要和数组元素类型先对应,数组定义为char,数组元素为整数型,这种数组定义是错误的。
下面我们用自定义函数来写二分查找:

#include<stdio.h>//标准输出,输入头文件int brnary_search(int arr[],int k,int sz)//int 这个函数返回整数,注:(int arr[]接收实参数组的第一个元素地址),数组传参数不会把这个数组全部传上去,而是把数组元素首个地址传上去。
{int left=0;//数组的左下标int light=sz-1;//数组的右下标,因为sz代表数组元素的个数,因为数组下标从0开始,使用最右下标应该-1;while(left<=light)//循环条件左下标必须小于或等于才能进入循环。{int mid=(left+light)/2;//每次求中间的下标if(arr[mid]<k)//判断中间下标对应的元素值小于查找k的值。{left=mid+1;//中间下标+1,为下次循环left的值}else if(arr[mid]>k)//判断中间下标对应的元素值大于查找k的值{light=mid-1;//上面判断所查找的值小,所以新的范围应该在左边,左边下标不变,右边下标为中间下标-1;}else{return mid;//查找的值与数组值相等,返回数组下标,}}return -1;//当查找左下标超过右下标,代表查询整数不在数组范围内,返回-1;
}int main()//主函数
{int arr[]={1,2,3,4,5,6,7,8,9,10};//定义数组int k=0;printf("请输入想查找的整数:");scanf("%d",&k);//从键盘获取要查找的整数int sz=sizeof(arr)/sizeof(arr[0]);//求出数组里元素的个数。int ret=brnary_search(arr,k,sz);//创建ret 变量来接收查找返回值()里的元素代表要传的实参数。if(-1==ret)//判断返回值是否等于-1;{printf("找不到\n");}else{printf("找到了,下标为:%d\n",ret);//定义函数返回的数组下标。}return 0;
}

算法思想:

注意:
1.函数在传数组时不会把数组全部传上去,而是把首元素地址传上去,所以要求元素个数时,要在主函数(main)内求,然后再传给函数,如果在自定义函数求形参数组元素个数时,结果数组元素是1.会导致左下标(left)等于右下标(light),除开首个元素有可能和查找整数相等外,其他查找不到。

2. 如果循环条件while(left<light)会少了一种left=light的情况,就不能100%查找里面元素。
3.mid中间下标一定要在循环内,因为它决定每次left或light的改变,如果不在循环内,可能循环会一直下去,查找范围不会缩小。

c语言用函数实现二分查找相关推荐

  1. c语言函数调用排序用插入法,C语言:编写查找和排序函数(二分查找,冒泡排序,选择排序法,插入排序)...

    任务代码: 二分查找数组的一个数字:(函数法) #include int binarySearch(int a[],int len,int key) { int low=0,high=len-1,mi ...

  2. PTA 函数题 二分查找(C语言)

    本题要求实现二分查找算法. 函数接口定义: Position BinarySearch( List L, ElementType X ); 其中List结构定义如下: typedef int Posi ...

  3. 考研数据结构之查找(9.8)——练习题之编写一个函数利用二分查找算法在一个有序表中插入关键字k并保持表的有序性(C表示)

    题目 编写一个函数,利用二分查找算法在一个有序表中插入一个关键字k,并保持表的有序性. 分析 先在有序表中利用二分查找算法查找关键字值等于或小于k的结点,m指向正好等于k的结点或l指向关键字正好大于k ...

  4. C语言用函数字符串的查找,字符串查找函数,C语言字符串查找函数详解

    在对 C 语言的编程实践中,字符串查找是最频繁的字符串操作之一,本节就对常用的字符串查找函数做一个简单的总结. 使用 strchr 与 strrchr 函数查找单个字符如果需要对字符串中的单个字符进行 ...

  5. C语言经典算法之二分查找详解

    作者:敲代码の流川枫 博客主页:流川枫的博客 专栏:C语言从入门到进阶 语录:Stay hungry stay foolish 集接口文档工具.接口Mock工具.接口自动化测试工具.接口调试工具于一体 ...

  6. C++ 语言基础 —— STL —— 算法 —— 二分查找算法

    STL 中,在 <algorithm> 头文件里提供了两个利用二分查找的方法在一个排好序的数组中进行查找. 在一个从小到大的排好序的数组中: lower_bound(begin,end,n ...

  7. 详解【C语言】中的二分查找法和折半查找法(例题解答)

    目录 问题 思路 详解 代码 问题 在一个有序数组中查找具体的某个数字n 比如我买了一双鞋,你好奇问我多少钱,我说不超过300元.你还是好奇,你想知道到底多少,我就让你猜,你会怎么猜? 答案:你每次猜 ...

  8. C语言strstr()函数用法-字符串查找

    1.函数定义 strstr()函数是一个参数为两个字符指针类型,返回值是char*类型的函数. 用于找到子串(str2)在一个字符串(str1)中第一次出现的位置(不包括str2的串结束符),并返回该 ...

  9. C语言strchr函数:字符串查找

    如果需要对字符串中的单个字符进行查找,那么应该使用 strchr 或 strrchr 函数. 一:strchr 头文件:#include <string.h> 1.1.strchr 函数原 ...

  10. C语言算法——实现二分查找

    #include <stdio.h> int main() {int search(int *p,int len,int x); //函数的声明int a[] = {1,2,3,5,7,8 ...

最新文章

  1. 第一个MapReduce程序
  2. linux进不了容器配置目录,linux – 在Docker容器中使用bcrypt的ELF头文件或安装问题...
  3. 程序员如何面对 HR 面试的 40 个问题
  4. 联想小新300加固态_就联想小新 Pro 13 固态硬盘混用一事,官方回应
  5. CleanMyMac for mac之偏好设置
  6. 使用navigator对象,输出当前浏览器的信息
  7. Poj 1338 Ugly Numbers(数学推导)
  8. PMP培训班内部资料,免费分享
  9. 04 可视化开发工具
  10. 写出ch为英语字母的c语言表达式,变量英文,编程 变量 定义的英语
  11. 剑指 Offer(C++版本)系列:剑指 Offer 13 机器人的运动范围
  12. 安全狗陈荣有:打造“即开即用”的云原生安全能力
  13. 超具性价比的学生神器,讯飞智能录音笔给足惊喜
  14. 计算 TCP/IP Socket 连接上下行额外流量的两个办法
  15. 2019/12/24论文小组交流
  16. 药家鑫案真相!做父母的必看
  17. 基于stm32物联网开发板(1)
  18. Windows boost 下编译 python 库 boost_python-vc120-mt-1_58.lib
  19. 量子光学偏振态小练习
  20. 龙芯3A5000 上安装docker-compose

热门文章

  1. android apk 微信登入_图文详解Android集成微信登录的步骤
  2. Windows Azure 成为业内首家被授权为 FedRAMP JAB P-ATO 的供应商
  3. 英雄连的制作公司THQ历史
  4. OpenGL编程(四)改变窗口大小时保持图形的原形
  5. RTD原理及其温度采集
  6. 画笔Paint及模拟画图工具
  7. python获取当前本机ip
  8. android10返回mac地址,android 获取mac地址
  9. C++系列(纯虚函数和抽象类)
  10. VMware连接不上网