首页 > php教程 > PHP开发 > 正文

二分法查找介绍

高洛峰
发布: 2016-12-19 16:29:39
原创
1936人浏览过

二分法查找

今天讲一下“二分法查找”,二分法查找思路就是在一段顺序数组中,每次和某一段数组中间数比大小。二分法查找的缺点是数组必须是顺序的(我以由小到大排序数据为例),优点是查询效率极高,时间复杂度是log2n。这种查找方式越是在大数据下,效果越是明显。下面附上源代码和单元测试,源代码包含两种算法,一种是循环一种是递归,大家多参考:
源代码:

       ///


       /// 使用二分法查找一个数据所在问题位置。(递归方法)
       /// 数组必须是从小到大排序的,如果是未排序数据可使用
       /// 或者类进行排序。
       /// 如果要查找的值在数组中不存在,返回-1。
       ///

       /// 数组
       /// 要查找的值
       /// 返回第几个,如果要查找的值在数组中不存在,返回-1
       public static int Search(int[] array, int value)
       {
           if (array == null) { throw new ArgumentException("array is null"); }
           if (array[array.Length - 1] == value) { return array.Length - 1; }
           return Search(array, 0, array.Length - 1, value);
       }
       private static int Search(int[] array, int beginIndex, int endIndex, int value)
       {
           int middle = (beginIndex + endIndex) / 2;
           if (endIndex == beginIndex)
           { return array[beginIndex] == value ? beginIndex : -1; }
           else if (endIndex == beginIndex + 1)
           {
               if (array[beginIndex] == value) { return beginIndex; }
               else if (array[endIndex] == value) { return beginIndex; }
               else { return -1; }
           }
           if (array[middle] == value)
           { return middle; }
           else if (array[middle] > value)
           { return Search(array, beginIndex, middle, value); }
           else if (array[middle]            { return Search(array, middle, endIndex, value); }
           return -1;
       }

       ///
       /// 使用二分法查找一个数据所在问题位置。(循环方法)
       /// 数组必须是从小到大排序的,如果是未排序数据可使用
       /// 或者类进行排序。
       /// 如果要查找的值在数组中不存在,返回-1。
       ///

       /// 数组
       /// 要查找的值
       /// 返回第几个,如果要查找的值在数组中不存在,返回-1
       public static int Search2(int[] array, int value)
       {
           int beginIndex = 0;
           int endIndex = array.Length - 1;
           while (true)
           {
               if (endIndex - beginIndex                {
                   if (value == array[beginIndex]) { return beginIndex; }
                   if (value == array[endIndex]) { return endIndex; }
                   { return -1; }
               }
               int middle = (beginIndex + endIndex) / 2;
               if (value                if (value == array[middle]) { return middle; }
               if (value > array[middle]) { beginIndex = middle; }
           }
       }

单元测试:
       [TestMethod()]
       [DeploymentItem("ZjyWorkCodeLibrary.dll")]
       public void SearchTest()
       {
           Random random = new Random();
           int[] array2 = new int[100];
           for (int i = 0; i            {
               array2[i] = random.Next(0, 1000);
           }
           int[] array3 = BitmapSort.Sort(array2);
           for (int i = 0; i            {
               Assert.AreEqual(BinarySearch.Search(array3, array3[i]), i);
               Assert.AreEqual(BinarySearch.Search2(array3, array3[i]), i);
           }
           Assert.AreEqual(BinarySearch.Search(array3, 9999), -1);
           Assert.AreEqual(BinarySearch.Search2(array3, 9999), -1);
       }

更多二分法查找介绍相关文章请关注PHP中文网!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号