美文网首页程序员
算法-二分搜索算法

算法-二分搜索算法

作者: 不存在的貓 | 来源:发表于2018-08-01 22:42 被阅读0次

算法:二分搜索算法(折半查找算法)
时间复杂度:O(log \;n)

  • 二分搜索算法概述
  • 二分搜索算法伪代码
  • 二分搜索算法实现

二分搜索算法概述

二分搜索算法,也称折半查找算法,即在一个有序数组中查找某一个特定元素。整个搜索过程从中间开始,如果要查找的元素即中间元素,那么搜索过程结束;反之根据中间元素与要查找元素的关系在数组对应的那一半查找,例如查找元素大于中间元素,则在整个数组较大元素的那一半查找,反复进行这个过程,直到找到元素,或者数组为空,查找不到元素。

二分搜索算法描述

给定一个数组A_0,A_1...A_{n-1}A_0 \le A_1 \le \cdot \le A_{n - 1},待查找元素为searchnum

  1. leftright分别表示左右端点,即要查找的范围;
  2. middle表示中间点,middle = \lfloor (left + right) / 2 \rfloor
  3. left > right,搜索失败;
  4. A{middle} > searchnumright = middle - 1,返回3;
  5. A{middle} < searchnumleft = middle + 1,返回3;
  6. A{middle} = searchnum,搜索结束,返回middle

二分搜索算法伪代码

while 实现

BINARY-SEARCH-WHILE(A, searchnum, left, right)

while left <= right
  middle = (left + right) div 2
  case
    A_middle < searchnum : left = middle + 1
    A_middle > searchnum : right = middle - 1
    A_middle = searchnum : return middle
return FAILED

递归实现

BINARY-SEARCH-RECURSION(A, searchnum, left, right)

if left <= right
  middle = (left + right) div 2
  case
    A_middle < searchnum :
      return (A, searchnum, middle + 1, right)
    A_middle > searchnum :
      return (A, searchnum, left, middle - 1)
    A_middle = searchnum :
      return middle

二分查找算法实现

C

while 版本

int binarySearch(arrType * a, arrType searchnum, int left, int right)
{
    int middle;
    while (left <= right) {
        middle = (left + right) / 2;
        if (a[middle] > searchnum)
            right = middle - 1;
        else if (a[middle] < searchnum)
            left = middle + 1;
        else if (a[middle] == searchnum)
            return middle;
    }
    return -1;
}

递归版本

int binarySearch(arrType * a, arrType searchnum, int left, int right)
{
    int middle;
    if (left <= right) {
        middle = (left + right) / 2;
        if (a[middle] > searchnum)
            return binarySearch(a, searchnum, left, middle - 1);
        else if (a[middle] < searchnum)
            return binarySearch(a, searchnum, middle + 1, right);
        else if (a[middle] == searchnum)
            return middle;
    }
    return -1;
}

Pascal

外部定义全局变量:

var
    a : array[1..n] of integer;
    searchnum, result :integer;

while 版本

procedure binarySearch(left, right :integer);
var
    middle : integer;
begin
    while (left <= right) do
        begin
            middle := (left + right) div 2;
            if (a[middle] > searchnum) then
                right := middle  - 1
            else if (a[middle] < searchnum) then
                left := middle + 1
            else
                begin
                    result := middle;
                    break;
                end;
        end;
    if left > right then
        result := -1;
end;

递归版本

procedure binarySearch(left, right :integer);
var
    middle : integer;
begin
    if left <= right then
        begin
            middle := (left + right) div 2;
            if (a[middle] > searchnum) then
                binarySearch(left, middle - 1)
            else if (a[middle] < searchnum) then
                binarySearch(middle + 1, right)
            else
                result := middle;
        end
    else
        result := -1;
end;

参考资料

本文首发于个人博客算法 - 二分搜索算法 | 不存在的貓, 转载请注明出处

相关文章

  • 算法-二分搜索算法

    算法:二分搜索算法(折半查找算法)时间复杂度: 二分搜索算法概述 二分搜索算法伪代码 二分搜索算法实现 二分搜索算...

  • day17_选择排序_数组的搜索算法

    选择排序 规律: 数组的搜索算法之二分搜索法

  • 算法汇总

    关于算法: 基础技巧:分治、二分、贪心排序算法:快速排序、归并排序、计数排序搜索算法:回溯、递归、深度优先遍历,广...

  • 算法与数据结构简介

    0x01 算法 基础技巧:分治、二分、贪心 排序算法:快速排序、归并排序、计数排序 搜索算法:回溯、递归、深度优先...

  • 【数据结构与算法 - Swift实现】11 - 二分查找 (Bi

    二分查找是高效搜索算法中的一员,时间复杂度为O(log n)。使用搜索算法前,需要满足两个条件: 集合中的元素必须...

  • 二叉树的插入和搜索--python实现

    本文首先介绍了二分查找法,采用“循环”和“递归”2种方法实现。采用递归算法实现了二叉树的插入和搜索算法。 一、二分...

  • 二分搜索算法

    介绍 二分搜索是一种在有序数组中查找某一特定元素的搜索算法。这种搜索算法每一次比较都使搜索范围缩小一半。 复杂度 ...

  • 【leetcode边做边学】二分查找应用

    二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好...

  • 算法之折半查找(二分法)

    算法背景: binarySearch折半查找算法,也称作二分法,是一种运用于顺序存储结构中的搜索算法,比如有序数组...

  • 离散数学及应用——算法、整数、矩阵

    算法 算法是进行一项计算或解决一个问题的一组有限多条准确的指令。 搜索算法 线性搜索 二分搜索 排序 冒泡排序 冒...

网友评论

    本文标题:算法-二分搜索算法

    本文链接:https://www.haomeiwen.com/subject/cesdvftx.html