欢迎光临
我们一直在努力

c语言 基础算法二分查找

前言:有些c语言的小白,对二分查找理解比较吃力或是理解不够透彻,一看代码就犯迷糊,这篇文章将用最直白的白大话带你走出理解困境。

首先想象一下,我在心里想了一个 1 到 100 之间的数字让你猜。 如果你从 1 开始一个个试:1, 2, 3, 4…… 运气不好的话,可能要猜 100 次,效率非常低。 但是,如果你换一种思路,从中间的数开始猜: 第一次猜 50:如果我说“大了”,那你立刻就能把 51-100 这一半的范围直接排除! 第二次猜 25:如果我说“小了”,那你又可以把 1-24 排除。 这样一来,每次比较都能砍掉一半的错误答案。二分查找,就是利用了这种“折半”的思想,提高效率。

首先第一步:创建一维数组给它赋值:

第二步:创建两个int类型变量left和right

left 为 arr 数组的 左边界(这里具体值就是 :下标0) right 为 arr 数组的 右边界(这里具体值就是 :下标9)(利用 sizeof 算出数组元素个数后,减 1 即可得到数组最后一个元素的下标)

第三步:创建3个int类型变量

mid(这个变量用来存放每次查找范围的中间位置的下标)

key(int key = 7(要查找什么数就变什么数);key是目标  这就是我们要在数组里找的那个数)

find (这是一个记号,用来记录是否找到了目标)

第四步:查找过程通常需要重复多次,且次数未知 所以要写循环 

left<=right

只要左边界 left 小于或等于右边界 right,就说明当前搜索范围内还存在数据,我们需要继续查找。

为什么是 <= ? 想象一下,如果只剩下最后1个数(此时 left == right),我们必须要进入循环最后一次,看看这个数是不是我们要找的 key。如果写成 left < right,这最后一个数就会被跳过,导致查找结果不准确,甚至失败。

第五步:mid就是下标中间值 左边界加上右边界 (这里的运算用的是 int 整型,结果会自动取整(例如 (0 + 9) / 2 结果为 4),因此无需担心小数点问题)

第六步:解释:arr[mid]  mid 是中间位置(下标),而 arr[mid] 就是该位置上具体的数值。 举例: 如果 mid = 4,那么 arr[4] 就是数组中第 4 个位置的数(比如是 5)。我们要比较的就是这个数 5 和目标数 key

因为判断要用到if 判断中间数和要找的数(目标数) 谁大 

注意:left和right都是下标 不要搞错 mid加减 也是关于下标的 (比较完数 加减的都是下标)

(对应 if)中间数(arr[mid])< 目标数(key) (即中间数太小了)。

第一处 left=mid+1  解释: 中间数(arr[mid)都太小了,那它左边的数肯定也小。而且中间这个数我们已经看过了,不要它了  所以左边界 left 直接跳过 mid,从 mid + 1 的位置开始继续找(缩小下标范围)。

(对应 else if)中间数(arr[mid]) > 目标数(key)(即中间数太大了)。

第二处 right=mid-1 解释: 既然中间数(arr[mid])都太大了,那它右边的数肯定也大。中间这个数没用,扔掉! 所以右边界 right 直接跳过 mid,截止到 mid – 1 的位置(缩小下标范围)

(对应else)如果既没有小,也没有大,说明肯定是一模一样(相等)了!  既然相等了,我们就做两件事: find = 1;:做个记号,告诉程序‘我找到了!’(1通常代表真/成功)。 break;(结束while循环) 既然已经找到了,就立刻跳出循环,不用再找了,省时间。

第七步:

if (find == 1): 意思就是“如果记号变成 1”。 说明刚才在循环(执行了 find=1)。找到了,那就把当时记下来的位置(mid)下标位置告诉我。 else: 意思就是“否则”(也就是记号还是 0)。 说明程序把整个数组都翻遍了,find 的值依然没有被改变,证明这个数压根不在数组里。那会提示你:‘未找到’。”

结果:

好,整个二分查找的过程就讲完了,相信你也懂了。

赞(0)
未经允许不得转载:171主机测评 » c语言 基础算法二分查找
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址