赞
踩
目录
一、 二分法概念用途
二、 超详思维图解
三、 超详使用方法实现代码运行操作
四、 总结
五、 结语
一:二分法概念用途
什么是二分法?有什么作用?一般用在何处?
概念:二分查找法算法,也叫折半查找算法(对半处理会提高寻找目标数字的效率);
作用:在一串有序的数字中,能快速寻找到你输入的数字,是一种很高效的查询算法。注意!!使用二分查找要求数组数据必须采用顺序存储结构有序排列。
!!!接下来注意咯
二:使用思维
思维:首先找出这串有序数字的中间值,每次都跟区间的中间值进行对比,将查找的区间缩小成之前的一半,进行二次与中间值对比,再次将查找的区间缩小到之前的一半,直到找到你要查找的元素为止,是不是很简单呢?实质就一个这么简单的思维。
详细图解如下:
三:使用方法实现代码运行操作
废话不多说上代码
1.定义变量
- int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
- int n = 0;
- int sz = sizeof(arr) / size(arr[0]);
- int left = 0;
- int right = sz - 1;
int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 }; 用数组表示这组有序数字
int n = 0; 定义即将寻找数数的变量
int sz = sizeof(arr) / size(arr[0]); 元素的个数( sz后面单独解释)
int left = 0; 区间最左边的数字
int right = sz - 1; 区间最右边的数字
int mid = (left + right) / 2; 定义一个中间值,中间值=(最左边加最右边)÷ 2
int sz = sizeof(arr) / size(arr[0]);的单独解解释:
!!sizeof 求空间大小用的
记公式!!! sizeof= 类型元素所占字节数 × 元素个数
se是int 类型,一个元素占四个字节,那sizeof (arr) 内有11个元素,所以sizeof(arr) 共占44个字节
4×11=44
sizeof(arr[ 0])内有一个元素,所以size(arr[0])共占4字节
4×1=4
所以 sz = sizeof(arr) / size(arr[0])= 44÷ 4 =11;
2.
- while (left <= right)
- {
- if (arr[mid] > n)
- {
- right = mid - 1;
- }
- else if (arr[mid] < n)
- {
- left = mid + 1;
- }
- else
- {
- printf("找到了,下标是: %d\n", mid);
- break;
- }
- }
- if(left > right)
- printf("找不到!\n");
if分支表达多种情况???
中间值mid > 要查找的数,最右边的值right-1,缩小区间范围便于下一次查找
中间值mid < 要查找的数,最左边的值left+1,缩小区间范围便于下一次查找
中间值mid = 要查找的数,恭喜你,找到了!!
if (left > right) (查找的数不在数组元素之内,就找不到)
printf("找不到!\n");
while 循环语句???
a. 因为查找不是一次就能找到,所以加个while 循环语句可以多查找几次,直到找到为止, break直接跳出循环;
b. while语句的条件
while (left <= right),left本身是最左数,right本身是最右数,所以一般情况下left<right,中间值就存在。
还有一种情况就是·left=right=mid,最左值等于最右值也就是最后的中间值,此时恭喜你,已找到目标。
if(left > right), 如果left>right,说明此元素不存在你的查找范围内,因此找不到。
3. 完整代码:
- #include<stdio.h>
- int main()
- {
- int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
- int n = 0;
- int sz = sizeof(arr) / size(arr[0]);
- int left = 0;
- int right = sz - 1;
- scanf("%d", &n);
- int mid = (left + right) / 2;
- while (left <= right)
- {
- if (arr[mid] > n)
- {
- right = mid - 1;
- }
- else if (arr[mid] < n)
- {
- left = mid + 1;
- }
- else
- {
- printf("找到了,下标是: %d\n", mid);
- break;
- }
- }
- if(left > right)
- printf("找不到!\n");
- return 0;
- }
4. 总结:二分法往简单里看就是三个步骤:
1. 对半折
2. 查找中间值( mid)
3. 缩小区间(看与mid的关系再决定,往左+1或者往 右-1)
5. 结语:
这是我第一次写博客,希望此文能够帮助到你,如有不足之处,望君留言。
如果本文对你有所帮助,记得点赞关注哟!笔者会持续更新干货,期待与君共勉!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。