数据结构之二分查找法(折半查找)
1.arr1代表超市会员的ID,arr2代表到店的客户的ID,现在想要知道到店的客户中哪些不是会员,好安排,可以使用二分查找法。使用二分法的前提是对查找表做排序。
下面简单介绍了二分查找法的原理:比如指针 l 和 r分别指向查找表的第一个关键字和最后一个关键字,指针 mid 指向处于 l和 r指针中间位置的关键字。在查找的过程中每次都同 mid 指向的关键字进行比较,由于整个表中的数据是有序的,因此在比较之后就可以知道要查找的关键字的大致位置。
例如在查找关键字 23 时,首先同 33 作比较,由于23 < 33
,而且这个查找表是按照升序进行排序的,所以可以判定如果静态查找表中有 23 这个关键字,就一定存在于 l 和 mid 指向的区域中间。所以此时r=mid-1;然后重新确定mid位置,mid= left + (right - left) / 2=0+(6-0)/2=3。所以索引为3,指向16的位置,同理依次对比,直到最终找到23.
还有一种情况就是要查找的数据不在表中,如下,查找50,根据上面所说的步骤,一直到最后l,mid,r都指向48的时候,48<50,所以l=mid+1,此时l>r了,所以表明没有此数据。
代码实现:
/// <summary> /// 二分查找法 /// </summary> /// <param name="arr"></param> /// <param name="target"></param> /// <returns></returns> public static int BinarySearch(int[] arr, int target) { int l = 0; int r = arr.length - 1; while (l <= r) { //这种算法是放置目标表是偶数的时候会出现问题。 int mid = l + (r - l) / 2; if (target < arr[mid]) { r = mid - 1; } else if (target > arr[mid]) { l = mid + 1; } else { //返回目标元素的索引 return mid; } } return -1; }
每个元素的比较次数明显比顺序查找法减少了很多:
其实c#数组中已经有封装的二分查找法,
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术