当前位置:首页 科普知识 二分搜索算法

二分搜索算法

发布时间:2023-09-07 00:58:00

在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二分搜索算法详细介绍

在计算机科学中,二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

二分搜索算法

二分搜索算法原理应用

计算步骤

给予一个包含

个带值元素的数组

或是记录,使

,以及目标值

,还有下列用来搜索

中位置的子程序。

如果

,则搜索以失败告终。

(中间值元素)为

如果

,令

并回到步骤二。

二分搜索算法

如果

,令

并回到步骤二。

,搜索结束;回传值

这个迭代步骤会持续通过两个变量追踪搜索的边界。有些实际应用会在算法的最后放入相等比较,让比较循环更快,但平均而言会多一层迭代。

大致匹配

以上程序只适用于完全匹配,也就是查找一个目标值的位置。不过,因为有序数组的顺序性,将二分搜索算法扩展到能适用大致匹配并不是很重要。举例来说,二分搜索算法可以用来计算一个赋值的排名(或称秩,比它更小的元素的数量)、前趋(下一个最小元素)、后继(下一个最大元素)以及最近邻。搜索两个值之间的元素数目的范围查询可以借由两个排名查询(又称秩查询)来运行。

排名查询可以使用调整版的二分搜索来运行。借由在成功的搜索回传{displaystyle m},以及在失败的搜索回传{displaystyle L},就会取而代之地回传了比起目标值小的元素数目。

前趋和后继查询可以借由排名查询来运行。一旦知道目标值的排名,其前趋就会是那个位于其排名位置的元素,或者排名位置的上一个元素(因为它是小于目标值的最大元素)。其后继是(数组中的)下一个元素,或是(非数组中的)前趋的下一个元素。目标值的最近邻可能是前趋或后继,取决于何者较为接近。

范围查询也是直接了当的。一旦知道两个值的排名,不小于第一个值且小于第二个值的元素数量就会是两者排名的差。这个值可以根据范围的端点是否算在范围内,或是数组是否包含其端点的对应键来增加或减少1。

二分搜索算法复杂分析

时间复杂度

折半搜索每次把搜索区域减少一半,时间复杂度为

。(n代表集合中元素的个数)

空间复杂度

,虽以递归形式定义,但是尾递归,可改写为循环。

二分搜索算法示例代码

C 版本- 递归

int binary_search(const int arr, int start, int end, int khey) {if (start > end)return -1; int mid = start + (end - start) / 2;    //直接平均可能会溢位,所以用此算法if (arr > khey)return binary_search(arr, start, mid - 1, khey);else if (arr < khey)return binary_search(arr, mid + 1, end, khey);else    return mid;        //最後检测相等是因为多数搜寻状况不是大於要不就小於}

C 版本- while 循环

int binary_search(const int arr, int start, int end, int key) {    int ret = -1;       // 未搜索到数据返回-1下标    int mid;while (start <= end) {mid = start + (end - start) / 2; //直接平均可能会溢位,所以用此算法if (arr < key)start = mid + 1;else if (arr > key)end = mid - 1;else {            // 最後检测相等是因为多数搜寻状况不是大於要不就小於ret = mid;              break;        }}return ret;     // 单一出口}

javascript 版本

Array.prototype.binary_search = function(low, high, khey) {if (low > high)return -1;var mid = parseInt((high + low) / 2);if (this > khey)return this.binary_search(low, mid - 1, khey);if (this < khey)return this.binary_search(mid + 1, high, khey);return mid;};

Python3 版本 递归

def binary_search(arr,start,end,hkey):if start > end:return -1mid = start + (end - start) / 2if arr > hkey:return binary_search(arr, start, mid - 1, hkey)if arr < hkey:return binary_search(arr, mid + 1, end, hkey)return mid

Python3 版本 while 循环

def binary_search(arr, start, end, hkey):while start <= end:mid = start + (end - start) // 2if arr < hkey:start = mid + 1elif arr > hkey:end = mid - 1else:return mid

C# 版本

二分搜索算法

 static int binary_search(int arr, int start, int end, int khey) {     int mid;     while (start <= end)     {         mid = (start + end) / 2;         if (arr < khey)             start = mid + 1;         else if (arr > khey)             end = mid - 1;         else             return mid;      }     return -1; }

Swift 版本

import Foundation/// 二分搜索完全匹配////// - Parameters:///   - arr: 有序数组///   - start: 起始位置///   - end: 结束点///   - khey: 特点目标值/// - Returns: 返回查找结果func binarySearch(arr: , start: Int, end: Int, khey: Int) -> Int? {    guard start < end else {        return nil    }    let mid = start + (end - start) / 2    if arr > khey {        return binarySearch(arr: arr, start: start, end: mid - 1, khey: khey)    } else if arr < khey {        return binarySearch(arr: arr, start: mid + 1, end: end, khey: khey)    } else {        return mid    }}

Java 递归

public static int binarySearch(int arr, int start, int end, int hkey){    if (start > end)        return -1;     int mid = start + (end - start)/2;    //防止溢位    if (arr > hkey)        return binarySearch(arr, start, mid - 1, hkey);    if (arr < hkey)        return binarySearch(arr, mid + 1, end, hkey);    return mid;   }

Java while 循环

```Java public static int binarySearch(int arr, int start, int end, int hkey){    int result = -1;     while (start <= end){        int mid = start + (end - start)/2;    //防止溢位        if (arr > hkey)            end = mid - 1;        else if (arr < hkey)            start = mid + 1;        else {            result = mid ;              break;        }    }     return result; }

温馨提示:
本文【二分搜索算法】由作者 爱百科 转载提供。 该文观点仅代表作者本人, 自学教育网 信息发布平台,仅提供信息存储空间服务, 若存在侵权问题,请及时联系管理员或作者进行删除。
(c)2008-2025 自学教育网 All Rights Reserved 汕头市灵创科技有限公司
粤ICP备2024240640号-6