二分查找法
作者介绍:友友们好我是沐曦希,可以叫我小沐💕
作者主页:沐曦希的个人博客主页.🎉
作者的gitee:https://gitee.com/muxi-c-language
C语言系列文章:
🎈 1. 循环语句这些知识点你真的会了吗?(1)
🎈2. 分支语句你会了吗?
🎈3. .C语言第五课.
🎈4. C语言第四课.
🎉小沐和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步,成为合格的卷王。✨如果文章有错误,欢迎在评论区✏️指正。那么开始今天的学习吧!😘
文章目录
- 1.前言
- 2.二分查找法
- 3.写在最后
1.前言
二分查找是一种算法,其输入是一个有序的元素列表(必须是有序的)✏️,如果查找的元素包含在列表中,二分查找返回其位置,否则返回NULL(空指针)。例如:有一个数组存储了1~100,随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了和对了。这是很传统的查找方法,检测次数太多,太繁琐,那么便有了二分查找法。
2.二分查找法
“二分查找“也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。查找过程首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
例如:
一个有序数组存储1~10,设需要查找的数字则为7。
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int left = 0;int right = sizeof(arr) / sizeof(arr[0]) - 1;int mid=left+(right-left);//这样为了防止数值过大而溢出
第一种情况是当被判断为猜大了后:此时right的下标就变为了mid-1,left不变
if (arr[mid] > key){right = mid - 1;}
第二种情况是当被判断为猜小后,mid下标变为mid+1,left下标不变。
if (arr[mid] < key){left = mid + 1;}
第三种情况是当arr[mid]为所查找的值时候,直接打印下标
if(arr[mid]==k) printf("找到了,下标为:>%d",mid);
代码实现:
#includeint main(){int arr[] = {0,1,2,3,4,5,6,7,8,9};int left = 0;int right = sizeof(arr) / sizeof(arr[0]) - 1;int key = 7;int mid = 0;while (left <= right){mid = (left + right) / 2;if (arr[mid] > key){right = mid - 1;}else if (arr[mid] < key){left = mid + 1;}elsebreak;}if (left <= right)printf("找到了,下标是:>%d\n", mid);elseprintf("找不到\n");}
从而实现了简单的一个有序数组的二分查找问题。
如果写一个关于二分查找的函数呢?
代码:
如果实现一个二分查找函数:int bin_search(int arr[], int left, int right, int key){ int mid = 0; while(left<=right) { mid = (left+right)>>1; if(arr[mid]>key) { right = mid-1; } else if(arr[mid] < key) { left = mid+1; } else return mid;//找到了,返回下标 }
3.写在最后
那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!😘感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。
你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的🙌关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧😘
下一期见了!