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#数组中已经有封装的二分查找法,