【算法模板】Binary Search 二分查找

模板:

  给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

int binarySearch(vector<int> &array, int target) {
        if (array.size() == 0) {
            return -1;
        }

        int start = 0;
        int end = array.size() - 1;
        int mid;

        while (start + 1 < end) {
            mid = start + (end - start) / 2;
            if (array[mid] >= target) {
                end = mid;
            } else {
                start = mid;
            }
        }

        if (array[start] == target) {
            return start;
        }
        if (array[end] == target) {
            return end;
        }

        return -1;
    }

  若将条件改为查找target最后一次出现的下标(从0开始),那么程序将发生改变,循环中如果 array[mid] = target, 则 start = mid; 且最后的边界判断改为先判断

array[end] == target; 其他不变。

int binarySearch(vector<int> &array, int target) {
        if (array.size() == 0) {
            return -1;
        }

        int start = 0;
        int end = array.size() - 1;
        int mid;

        while (start + 1 < end) {
            mid = start + (end - start) / 2;
            if (array[mid] <= target) {
                start = mid;
            } else {
                end = mid;
            }
        }

        if (array[end] == target) {
            return end;
        }
        if (array[start] == target) {
            return start;
        }

        return -1;
    }

解析:

  已排序很重要,而且排序是降序还是升序写法也不一样。

  写程序先写异常处理,这里对应的是数组为空的情况。

  start 和 end 分别初始化为 0 和 array.size() - 1。

  取中值使用 mid = start + (end - start) / 2; 目的是为了防止 start + end 的值超出int范围发生溢出错误。

  循环停止条件为 start < end-1;没有等号,如果取等号,那么有可能进入死循环,如:start = 1; end = 2; 那么 mid = 1;那么此时如果令 start = mid,程序将进入死循环。

  循环停止时肯定有 start + 1 == end;或者数组元素只有一个,也就是说 start 和 end 要么相邻(数组元素个数大于1),要么相交(数组元素个数为1),那么都可以归结为最后的判断语句,根据题目的要求(第一次出现还是最后一次出现)确定判断顺序。  

时间: 2024-10-07 10:22:07

【算法模板】Binary Search 二分查找的相关文章

[01]Binary Search二分查找

Binary Search二分查找 作用:二分查找适用于有序的的数组或列表中,如果列表及数组中有n个元素,通过二分查找查询某一元素的位置需要的步骤是log2(n)(注:该log的底数是2) 1.Python实现 def binary_search(list,item): low = 0 high = len(list)-1 #python数组ID从0开始,与matlab不同. t = 0 while low <= high: t = t + 1; mid = round((low + high)

Binary Search 二分查找总结

Binary Search基本的复杂度为O(logn).如果提示需要对O(n)的算法进行优化,非常可能就是二分,另外二分一般出现在排序数组或者变形后的排序数组(rotated array)当中.二分主要有两种,binary search on index(index上的二分)和binary search on result(结果上的二分).index上的二分主要有 result上的二分主要有Sqrt(x),Wood cut两种. 另外binary search的版本很多,区别在终结条件,比如是l

Binary Search (二分查找)

思路就是砍一半, 适用于sorted array. 时间复杂度O(lgn). 每次都是取中间的跟target比较, 比target小的话目标值肯定在lower和mid之间, 比target大的话在mid和high之间~ 1 public int binarySearch(int num[], int target){ 2 int lower = 0; 3 int high = num.length - 1; 4 while(lower <= high){ 5 int mid = lower +

算法复习笔记:二分查找

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

十大基础实用算法之归并排序和二分查找

归并排序 归并排序是建立在归并操作上的一种有效的排序算法.该算法是采用分治法(Divide and Conquer)的一个非常典型的应用. 算法步骤: 1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置 3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 4. 重复步骤3直到某一指针达到序列尾 5. 将另一序列剩下的所有元素直接复制到合并序列尾 用分治策略解决问题分为三步:分解

算法导论 2.3-5 二分查找

1.二分查找(Binary Search) 二分查找又称折半查找,它是一种效率较高的查找方法.    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且表的存储结构为顺序结构.不妨设有序表是递增有序的. 2.二分查找的基本思想 二分查找算法思想: (1)首先确定该区间的中点位置: mid = ( left + right ) / 2; (2)然后将待查的K值与R[mid].key比较,若相等,则查找成功并返回此位置:否则须确定新的查找区间,继续二分查找,具体方法如下: ①若R[mid].

在路上---学习篇(一)Python 数据结构和算法 (5)二分查找、二叉树遍历

独白: 利用算法进行查找指定元素,最近学习二分查找和二叉树遍历.二分查找前提是在有序中进行查找,二叉树引入了树的概念.树的概念其中有许多小知识点,也是一种新的数据结构.还是之前的感悟,需了解其本质才会写出更好的算法. 二分查找 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用

js基本算法:冒泡排序,二分查找

知识扩充: 时间复杂度:算法的时间复杂度是一个函数,描述了算法的运行时间.时间复杂度越低,效率越高. 自我理解:一个算法,运行了几次时间复杂度就为多少,如运行了n次,则时间复杂度为O(n). 1.冒泡排序 解析:1.比较相邻的两个元素,如果前一个比后一个大,则交换位置. 2.第一轮的时候最后一个元素应该是最大的一个. 3.按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较. 1 function sort(elements){ 2 for(v

501. Find Mode in Binary Search Tree查找BST中的众数

[抄题]: Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently occurred element) in the given BST. Assume a BST is defined as follows: The left subtree of a node contains only nodes with keys less than or equal to t