数据结构之二分查找法(折半查找)

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

 

posted @ 2021-08-28 11:06  安静点--  阅读(374)  评论(0编辑  收藏  举报