详谈二分查找(C语言)

首先,给大家介绍什么叫做二分查找(二分搜索)
二分搜索法:通过不断的缩小解可能存在的范围,从而求得问题最优解的方法。在程序设计中经常看到二分搜索和其他算法结合

下面我们将详细的介绍如何写好一个详细准确的二分查找的精准代码和相应的算法

题目1
从有序数组中查找某个值,返回该元素的下标

解析过程:例如我们给出一个有序的数组int ar[]={12,23,34,45,56,67,78,89,90},共n个元素,最基本的想法是我们取数组的中间元素ar[mid]=56与你要查找的元素x进行比较,当ar[mid]>x时,再从ar[0]-ar[mid]继续递归使用二分查找,反之,同理。

这是我们最基本的思路,那么首先我们怎么来确定这个中间元素呢??可能有人会给出这样的答案:我们首先用标记变量i,j分别指向数组的起始和末尾,那么mid=(i+j)/2,(这里是否会产生相应的问题呢?后面我将会进行作答)
相应的我们会给出最基本的代码,如下

这是最基本的代码,对于初学者而言。但是呢这个代码存在很多的问题
①当我们调用这个函数时,最基本的要求是,对主函数中的数据只能是读取调用,而不可改变:这时候就要通过const命令来实现。
②在任何时间调用一个带有指针参数的函数时,我们的必要工作时判断该指针的指向是否为空:
if(NULL==ar)return -1;//这里为什么NULL在前面呢?当你将==误输为=时会有不同的效果(系统会提示出错,否则不会)
③我们可以知道当这个数组的元素数量到达一定数量时,(i+j)是否会产生溢出,我们无法保证,那么我们怎么处理会避免这种情况的发生?逆向思维,加法不行那我们考虑减法mid=(j-i+1)/2+i。
④这是一种特殊情况:数组中有多个重复元素,要求输出的是最左边的(最右边和中间,同理)元素的下标,那么我们将怎么改进呢?可知当第一次找到x时,在这个条件下再对ar[mid-1]进行判断。
⑤函数的出口也就是返回值太多太乱,需要进行特殊的处理,通过定义一个变量pos,最后只需return pos;


改进后的代码:
这样就完全解决了上面的问题,使代码更加的精简。


题目二:
二分搜索算法代码


这是针对于有一定基础的C语言学者的算法。

这种算法被称为二分搜索。该算法除了在上例中提到的在有序数列查找值之外,在求解最优解的问题上也非常有用,将在下一篇给出。

以上代码,或者算法 思想有问题希望大家留言给出,以便及时改正,大家共同进步。

猜你喜欢

转载自blog.csdn.net/genzld/article/details/80063212