`
技术无涯苦作舟
  • 浏览: 12126 次
社区版块
存档分类
最新评论

使用循环与递归的二分查找

阅读更多
二分查找


简述:

二分查找主要用于在有序数组中查找某个数据项,具有查找速度快的优点,其算法所花时间与数据项的个数的比可用大O表示为O(logN)来表示。数据项的个数越多,越能反应出其优点。

循环

Code:


    Long[] array; //表示一个Long型的数组引用, 需要初始化
    int nElements; //表示数组中数据项的个数, 需要初始化
    int compareTimes = 0; //定义比较次数

    public int find(long searchKey) {
        int lowerBound = 0; //表示下界
        int upperBound = nElements - 1; //表示上界
        int curIn;

        while(true) {
            compareTimes++;//循环一次,比较次数加1
            curIn = (lowerBound + upperBound) / 2;
            if (array[curIn] == searchKey) {
                return curIn;  //找到所要查找的数据,位于array[curIn]
            } else if (lowerBound > upperBound) {
                return nElements; //范围不存在, 返回数据项的个数表示找不到数据
            } else {
                if (array[curIn] > searchKey) { //查找数据位于array[lowerBound] - array[curIn]之间
                    upperBound = curIn - 1; //此时上界减1, 因为之前已经判断过array[curIn]和searchKey的值是否相等
                } else { //查找数据位于array[curIn] - array[upperBound]之间
                    lowerBound = curIn + 1; //此时下界加1
                }
            }
        }
    }


查找次数计算:
通过求以2为底,范围N的对数可得到二分查找所需要的比较次数。
比如范围为10,那么4次比较完全可以查找到任何该范围内的数,实际上可以涵盖范围为16的查找。2的3次方 < 10 < 2的4次方

使用二分查找来插入数据项

虽然比较次数变小了,但是数据项的移动仍然与线性插入一样,O(N).

public void insertByBinarySearch(long value) {
        int lowerBound = 0; //表示下界
        int upperBound = nElements - 1; //表示上界
        int curIn;

        while (true) {
            curIn = (lowerBound + upperBound) /2;
            //如果value的值和array[curIn]相等, 则插入到curIn+1的位置,原curIn右边的数据项右移.
            if (array[curIn] == value) {
                for (int k = nElements - 1; k > curIn; k--) {
                    array[k+1] = array[k];
                }
                array[curIn+1] = value;
                nElements++;
                compareNums++; //比较次数
                break;
            } else if (array[curIn] > value) { //value的值小于array[curIn].
                if (array[curIn-1] < value) { //value的值位于array[curIn-1]和array[curIn]之间.
                    for (int k = nElements; k > curIn; k--) {//curIn及其后续的所有数据项依次右移
                        array[k] = array[k-1];
                    }
                    array[curIn] = value; //在curIn位置插入value
                    nElements++;//数据项个数+1
                    break;
                } else { //继续2分查找
                    upperBound = curIn -1;
                }
                compareNums++; //比较次数
            } else { //value的值大于array[curIn].
                if (value < array[curIn+1]) { //value的值位于array[curIn]和array[curIn+1]之间.
                    for (int k = nElements - 1; k > curIn; k--) { //curIn+1及其后续的所有数据项依次右移
                        array[k+1] = array[k];
                    }
                    array[curIn+1] = value;//在curIn位置插入value
                    nElements++;//数据项个数+1
                    break;
                } else { //继续2分查找
                    lowerBound = curIn + 1;
                }
                compareNums++;  //比较次数
            }
        }
    }


递归

通常,递归的速度要比循环慢一些,但是递归的代码要简洁很多。

    //对外提供的public方法, 调用private recFind()方法
    public int find(long searchKey) {
        return recFind(searchKey, 0, nElements - 1);
    }

    private int recFind(long searchKey, int lowerBound, int upperBound) {
        int curIn;
        curIn = (lowerBound + upperBound) / 2;

        if (a[curIn] == searchKey)
            return curIn;
        else if (lowerBound > upperBound)
            return nElements;
        else {
            if (a[curIn] < searchKey)
                return recFind(searchKey, curIn + 1, upperBound);
            else {
                return recFind(searchKey, lowerBound, curIn - 1);
            }
        }
    }
分享到:
评论

相关推荐

    Python3实现非递归二分查找

    在Python3中实现非递归二分查找,首先需要一个已经排序的列表。以下是实现该算法的关键步骤: 1. 初始化查找范围:设置查找区间的左右边界,通常是`[0, len(array) - 1]`。 2. 当左边界小于等于右边界时,进入循环...

    分别用递归和非递归方法实现二分查找算法 的完整程序

    分别用递归和非递归方法实现二分查找算法 的完整程序,indexof()返回的是循环实现的二分法查找,getindex()实现的是递归算法实现的二分法查找。

    折半(二分)查找的c++代码(递归和非递归)实现

    非递归版本的二分查找避免了递归调用的开销,通常采用循环来实现: 1. **初始化边界**:同样设定`left`为0,`right`为数组长度减1。 2. **执行循环**:当`left`不大于`right`时,进行以下操作: - 计算`mid`。 - ...

    递归算法和二分查找法

    递归的概念可以通过一个生动的故事来理解,比如"从前有座山,山上有座庙"的循环叙述,这种对象部分由自身组成的特性就是递归的体现。 在计算机科学中,递归通常用于解决那些可以分解为相同子问题的问题。一个递归...

    快排与二分检索递归与非递归

    快速排序(Quick Sort)与二分查找(Binary Search)是计算机科学中两种极其重要的算法,它们在处理大量数据时有着高效的表现。这两种算法都涉及到递归和非递归的实现方式,各有优缺点。下面我们将深入探讨这两个...

    Java,二分查找,递归以及非递

    对于二分查找,我们首先确定数组的中间元素,然后比较该元素与目标值。如果中间元素等于目标值,返回其索引;如果目标值小于中间元素,则在左半部分数组上递归查找;反之,在右半部分数组上递归查找。 ```java ...

    深入理解二分查找(一、二分查找及其变体)

    1. **循环版二分查找**:使用循环结构,避免了递归带来的额外开销。 2. **递归版二分查找**:通过递归函数实现,直观且易于理解。 3. **迭代版二分查找**:通过while循环和条件判断逐步缩小搜索范围。 4. **二分查找...

    二分查找最简单教程

    二分查找是一种在有序数组中查找特定元素位置的算法,它利用数组元素排序的特性,通过比较数组中间元素与目标值的大小,将查找区间缩半来加快查找速度。该算法适用于有序集合,能够将时间复杂度从线性查找的O(n)降低...

    二分搜索的递归和非递归实现

    二分搜索,也被称为折半查找,是一种在有序数组中查找特定元素的高效算法。它主要利用了分治策略,将问题规模不断减半,从而快速定位目标值。本篇文章将详细探讨二分搜索的递归和非递归实现。 首先,我们来看递归...

    折半查找的递归与非递归算法

    **折半查找(二分查找)算法** 折半查找,又称二分查找,是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将数组分成两个部分,每次比较中间元素与目标值,根据比较结果缩小搜索范围。如果中间元素等于...

    python二分查找算法的递归实现方法

    为了测试这个递归二分查找函数,我们可以创建一个有序列表并调用`binSearch`: ```python testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42] print(binSearch(testlist, 3)) # 输出: False print(binSearch(testlist, ...

    PHP基于二分法实现数组查找功能示例【循环与递归算法】

    代码中,使用bsearch_r和bsearch两个函数分别表示递归和循环实现的二分查找算法,它们都是在有序数组上进行查找操作。 在应用二分查找算法时,需要了解其适用条件和限制,即必须保证数组是有序的。此外,在实际应用...

    c++二分查找

    根据给定的信息,我们可以总结出以下关于C++中非递归方式实现的二分查找算法的知识点: ...通过以上分析,我们可以看出这段代码实现了一个基本的非递归二分查找算法,并能够有效地在有序数组中查找特定元素。

    C 二分查找 递归与非递归的实现代码

    - `binSearch3` 函数使用循环实现二分查找。同样计算中间索引`mid`,然后根据比较结果更新搜索范围。循环条件是`start ,在循环内部调整`start`和`ends`的值。循环结束后,需要检查是否找到了目标值,如果没有找到...

    计算机算法分析 二分查找 分治算法

    **二分查找与分治算法详解** 二分查找是一种基于分治策略的高效搜索算法,主要应用于有序数据集合。在给定的升序排列的数组a[0:n-1]中,二分查找的目标是找到特定元素x的位置,或者确认元素不在数组中。算法的基本...

    实验十二------顺序和二分查找算法

    二分查找算法的实现方法可以使用递归结构,例如使用函数调用自身来实现二分查找。 二分查找算法的时间复杂度是O(logn),其中n是数组的长度。因为二分查找算法每次都将数组的长度减半,因此它的时间复杂度远远小于...

    数据结构二分查找 希望能帮助到你们

    在C#中实现二分查找,可以使用循环或递归的方式。以下是使用循环实现的一个示例: ```csharp public int BinarySearch(int[] array, int target) { int left = 0; int right = array.Length - 1; while (left )...

    二分查找的实现

    递归实现二分查找的代码如下: ```python def binary_search_recursive(arr, target, low, high): if low &gt; high: return -1 # 搜索范围为空,未找到目标值 mid = (low + high) // 2 if arr[mid] == target: ...

    C+++版二分查找

    在给定的代码示例中,作者首先使用了冒泡排序算法对输入的数组进行排序,然后利用递归方式实现了二分查找算法。 #### 三、冒泡排序 冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次...

    文件读出数组进行选择排序和二分查找(java)

    在Java中,你可以通过递归或循环实现二分查找。 5. **Test1.java**:这可能是一个实现上述功能的Java源代码文件,包含读取文件、处理数组、选择排序以及二分查找的逻辑。通过查看这个文件的源代码,可以学习到如何...

Global site tag (gtag.js) - Google Analytics