二分查找
什么是二分查找
二分查找是数组的一个运用。
在一个指定的有序数组中,查找具体的一个数时,我们就可以使用二分查找。
二分查找的使用
前提:二分查找的受用对象一定是有顺序的排序了的数组,如果是乱序的就不能使用了。
如题:在arr数组中找7,如果找到就打印找到,如果找不到,就打印找不到。
这里我们一开始假定找不到,设置了函数find来进行操作。但是我们会发现,如果这样操作,使用for循环进行逐个查找,会很麻烦,如果数字大了,操作次数就会非常多。这个时候,我们就可以采取二分法查找,也叫折半查找。
如题:查找数组中的某个数,如果找得到,就打印其下标:
如图,这只是一次二分查找,且前提是有序数组。
我们需要知道数组的元素个数,图中使用函数sz来进行表示。
如果一次没找到,那就得继续找下去,又要使用新的下标进行计算和查找,所以,这应该是一个循环体,我们可以使用while循环语句进行。
while循环语句
while循环语句会首先检验一个条件,就是括号内的表达式,如果条件为真,就执行紧跟其后的循环语句块,每执行一遍,都会回到while语句处,重新检验条件是否满足。知道条件不满足时,就会跳出循环体中的语句,直接执行后面的程序代码。 若一开始条件就不满足,则直接跳过循环语句。
如图,我们使用三个变量:left,right,mid,进行计算;为了求下标则先用函数sz计算数组的元素个数;利用while循环语句进行查找。
二分查找的理解
通过上面的示例,我们可以发现,其实二分查找就是通过对首尾两个数相加求平均值(也就是中间值),然后对我们所需要查找的数进行对比,大了,就去掉右边的大数,再首尾取平均值,再比较,周而复始,知道最后找到或者无法找到所求的数,进行反馈。所以,很明显,我们需要用循环语句进行查找,同时,首位相加取平均值一定需要数组是按照从大到小或者从小到大的顺序进行排列的,或者,数组是有序的。
函数
函数的概念
C语言中的函数就是一个完成某些特定的任务的一小段代码。这段代码是有特殊的写法和调用的方法的。
C语言的程序其实就是由无数个小的函数组合而成的,也就是说:一个大的计算任务可以分解成若干个较小的函数,对应不同的任务。同时一个函数如果能完成某个特定任务的话,这个函数也是可以复用的,提升了开发软件的效率
函数的分类
C语言中,我们一般会看到两种函数:库函数和自定义函数。
库函数
标准库和头文件
C语言标准中规定了C语言的各种语法规则,但是C语言不提供库函数,C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为库函数,那不同的编译器厂商根据ANSIC提供的C语言标准就给出了一系列函数的实现。这些函数就被称为库函数。
如:scanf,printf都是库函数,不过这些函数已经是现成的,我们只要学会就能直接使用了。
各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了申明。
有了库函数,一些常见的功能就不需要程序员自己实现了。
库函数相关头文件: http://zh.cppreference.com/w/c/header
库函数的使用
库函数的学习和查看工具:
C/C++官方链接:http://zh.cppreference.com/w/c/header
自定义函数
自定义函数其实比库函数更加重要,能带来鞥多的创造性。
函数的语法形式
其实自定义函数和库函数是一样的:
ret_type fun_name(形式参数)
{
}
ret_type 是函数返回类型(如:int整型、float浮点型等等)
函数的返回类型只有两种:1.void 表示什么都不返回,明确没有参数 ;2.其他类型 int float 等等
fun_name是函数名
{} 大括号括起来的是函数体
函数一般会输入一些值,(可以是0个,也可以是多个),经过函数内的计算,得出结果。
函数的举例
如题:写一个加法函数,完成两个整型变量的加法操作
自定义了Add函数,int就是上图中的ret_type,Add就是函数名。后面括号的内容就是形式参数。
形参和实参
实参
上面代码中,6-9行是关于Add函数的定义,有了函数后,再在第16行调用Add函数。
我们把第16行调用Add函数时,传递给函数的实参a和b,称为实际参数,简称为实参。
实际参数就是真实传递给函数的参数
形参
在上面代码中,定义Add函数的时候提到的x,y,是形式上的参数,简称形参。