zoukankan      html  css  js  c++  java
  • 数据结构之二分查找法(折半查找)

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

  • 相关阅读:
    idea项目maven配置
    IDEA配置maven项目启动
    IDEA导入本地项目教程
    EasyUi前端js禁止短时间内多次点击按钮方法
    EasyUi的form验证框位置修改
    div中的div如何居中
    Java导出Excel使用POI之SXSSFWorkbook方式
    java.lang.NoSuchMethodError
    eclipse导出项目时报错:problems were encountered during export
    直线检测方法—LSD论文翻译
  • 原文地址:https://www.cnblogs.com/anjingdian/p/15196284.html
Copyright © 2011-2022 走看看