C语言的方法1---二分法【初步的了解】
1.为什么要学习二分法
如果用传统的方法去查找数组中我们想要的数字,需要一个一个试验过去,非常浪费时间
用for循环来完成
2.二分法的底层逻辑
例如有 1 2 3 4 5 6 7 8 9 10 十个数先给这十个数标下标
0 1 2 3 4 5 6 7 8 9
我们需要找到的目标数字是7
推算 【1】取中间值(取得是下标的中间值):(0+9=4){4在顺序数列中对应的是5}
发现取得的对应数字小了,就在这个数字的下标上加1,此时判断数字出现在数字5的右边
【2】 得到(4+1)+9/2=7{7在顺序数列中对应的是8}
发现取得的数字大了,就在这个数字的对应下标减去1,此时判断数字出现在数字8的左边,数字5的右边
【3】得到5+(7-1)/2=5{5在顺序数列中对应的是6}
发现取得的数字小了,就在这个数字的下标加上1,此时判断数字出现在数字6的右边,数字7的左边
【4】得到6+(5+1)/2=6{6在顺序数列中对应的是7}
得到正确答案了
3.在c语言中的逻辑
- 先给定一个数组
- 在给定一个目标k,比如1
- 算出字符串的长度sizeof(arr)]/sizeof(arr[0])
- 定义左边的为0,右边为字符串长度减1
- 再定义一个变量为flag,代表是否取得目标
- 用while循环判断,在有序数列中才会有意义,所以左边的数经过循环之后一定会小于等于右边的数字
- 用左边的数字加右边的数字/2=中间数字
- 得到第一类大情况
- 得到的mid>k,k在中间数的左边,则将右边的数字定义为mid-1【fla=0】
- 得到的mid<k, k在mid的右边,则将左边的数字定义为mid +1
- 得到mid=k说明找到了【flag=1】
- 第二大类情况
得不到,说明给的值出错了
代码演示: