c#二分查找的两种方式

其实;两种方式的实现结果一样,却体现出了不同的思考过程;

地中方式,是在一个while循环中,每次从中间找,不断的去改变low 和 high的 位置,然后求他们的中间位置,知道low=high=0;如果还没有知道值,就直接返回-1;

        /// <summary>
        ///  二分查找方式
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static int BinaySearch(int[] arr, int target)
        {
            int len = arr.Length;
            int low = 0;
            int high = len - 1;
            //一个while循环就搞定了;
            while (low <= high)
            {
                int middleIndex = (low + high) / 2;
                int middleValue = arr[middleIndex];
                if (middleValue == target)
                {
                    return middleIndex;
                }
                else if (target > middleValue)
                {
                    //searching in right;
                    low = middleIndex + 1;
                }
                else
                {
                    //searching in left;
                    high = middleIndex - 1;
                }
            }
            //没有找到直接就return
            return -1;
        }

然后,是利用我们递归的方式来实现的;如果没有找到,子改变地址,然后recursionly的去searching

        /// <summary>
        ///  这样我们的二分查找的递归方式就出来了;
        ///  这个方式是我们用递归的方式来实现的;
        ///  不同的代码实现过程,体现了你不同的思考过程;
        /// </summary>
        /// <param name="arr"></param>
        /// <param name="low"></param>
        /// <param name="high"></param>
        /// <param name="target"></param>
        /// <returns></returns>
        public static int RecursionlyBinaySearch(int[] arr, int low, int high, int target)
        {
            int l = low;
            int h = high;
            if (l > h)
                return -1;
            int middleIndex = (l + h) / 2;
            int middleValue = arr[middleIndex];
            if (middleValue == target)
            {
                //stop finding;
                return middleIndex;
            }
            else if (target > middleValue)
            {
                // finding in right;
                return RecursionlyBinaySearch(arr, middleIndex + 1, high, target);
            }
            else
            {
                //finding in left;
                return RecursionlyBinaySearch(arr, l, middleIndex - 1, target);
            }

        }

本来,想整一个第三种方式出来的;。。。。。。。。。。。只是本来;

第一种做法,有一个bug,你发现了吗????而且!!!非常不明显;

详细的,请看这里;

https://research.googleblog.com/2006/06/extra-extra-read-all-about-it-nearly.html

这里还有更详细的介绍:

https://www.quora.com/Why-do-people-use-mid-low+-high-low-2-instead-of-low+high-2

原文地址:https://www.cnblogs.com/mc67/p/8297597.html

时间: 2024-07-31 08:11:57

c#二分查找的两种方式的相关文章

二分查找的两种实现方式

笔者在这里给出二分查找的两种实现方式. 一. 第一种是健忘版的二分查找,即不管是否已经找到target,查找算法都继续对表进行再分,直到剩下的表的长度为1. 递归实现如下: Error_code recursive_binary_1(const Ordered_list &the_list, const Key &target, int bottom, int top, int &position) { Record data; if (bottom < top) { int

二分查找的两种实现方式(JAVA)

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 条件是:1.必须

#1128 : 二分&#183;二分查找 ( 两种方法 先排序在二分O(nlogN) + 直接二分+快排思想O(2N) )

#1128 : 二分·二分查找 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Nettle最近在玩<艦これ>,因此Nettle收集了很多很多的船(这里我们假设Nettle氪了很多金,开了无数个船位).去除掉重复的船之后,还剩下N(1≤N≤1,000,000)种不同的船.每一艘船有一个稀有值,任意两艘船的稀有值都不相同,稀有值越小的船越稀有,价值也就越高. Nettle现在通过大建又造出了一艘船,他想知道这艘船是不是重复的.如果是重复的,那么这艘船在Nettle所

二分查找的两种写法

bool Bin_Search(const int *pre, int low, int high, const int key) { while(low < high) //注意 { int mid = low + ((high-low)>>1); if(pre[mid] == key) return true; else if(pre[mid] < key) low = mid + 1; else high = mid; //注意 } return false; } bool

二分查找算法(递归与非递归两种方式)

首先说说二分查找法. 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标. 采用非递归方式完成二分查找法.java代码如下所示. /* * 非递归二分查找算法 * 参数:整型数组,需要比较的数. */ public static int binarySearch(Integer[]srcArray,int des){ //第一个位置. int low=0; //最高位置.数组长度-1,因为下标是从0开始的. int h

二分查找算法(加法方式:斐波那契查找)

二分查找算法比较熟悉的是折半查找,但是折半查找中计算mid时,有加法和除法.下面介绍仅有加法方式的二分查找算法 核心思想利用斐波那契表达式来实现加法方式的折半查找 技巧点:1)将数组中数的个数(f(n)-1)分成 f(n-1) -1和 f(n-2)2):f(n) - 1 = (f(n-1)-1 )+ (f(n-2)-1) 在数组中因为要用到一个mid数(中间位置的数) 故总共要减掉1,故上述表达式成立. 1 #-*-coding: UTF-8 -*- 2 3 4 # 5 # 时间复杂度O(log

生成二维码的两种方式

利用qrcode生成二维码,(qrcode矩形二维码符号) 基于jquery的二维码生成插件qrcode,在页面中调用该插件就能生成对应的二维码.qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式: 使用插件时 1.首先在页面中加入jquery库文件和qrcode插件. <script type="text/javascript" src="jquery.js"></script> &

简介C#读取XML的两种方式

简介C#读取XML的两种方式 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-03 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询 XML作用 对于XML,想必各位都比较了解,我也就不用费笔墨来描述它是什么了,我想在未来的Web开发中XML一定会大放异彩,XML是可扩展标记语言,使用它企 业可以制定一套自己的数据格式.用于Internet的数据

网络笔记01-3 socket 实现百度页面的两种方式

scoket 实现百度页面的两种方式: 1.利用系统自带    //1.创建URL NSURL *url=[NSURL URLWithString:@"http://m.baidu.com"]; //2.创建请求   NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:url];   [request setValue:@"iPhone AppleWebKit" forHTTPHeader