二分法的查找图解

最近做了几家笔试题,基本在选择题都考到二分查找法的次数。由于对下标和数组大小的不确定,做错了好几个,今天,希望通过图解来说明一下二分查找的比较次数。

二分查找:给定数组是有序的,给定一个key值。每次查找最中间的值,如果相等,就返回对应下标,如果key大于最中间的值,则在数组的右半边继续查找,如果小于,则在数组左半边查找,。最终有两种结果,一种是找到并返回下标,第二种是没找到。

下面给个例子说明一下:

有一个数组arr[10];

0        1       2        3        4        5       6        7         8        9


3


6


7


10


11


16


20


33


56


89

定义两个边界下标low和high,定义中间下标mid;

low=0; high=10-1; mid = (low+high)/2;

在进行每一步的比较时,low<=high;

如果我们寻找key为56的值的下标。

第一次我们找到中间下标mid = 4;

0       1        2       3        4        5       6        7        8         9


3


6


7


10


11


16


20


33


56


89

 low                                mid                                            high

arr[4] = 11,比当前key值小,所以我们在右半边查找,令low = mid + 1;high不变;

我们找到中间下标mid = (5+9)/2 =7;

0       1        2       3        4         5       6        7         8        9


3


6


7


10


11


16


20


33


56


89

low              mid              high

arr[7] = 33,比当前key值小,所以我们在右半边查找,令low
= mid + 1;high不变;

我们找到中间下标mid = (8+9)/2
=8;

0       1        2       3        4        5        6        7         8        9


3


6


7


10


11


16


20


33


56


89

              low     high

                                           mid

此时key == arr[mid]
== arr[8];停止查找,返回下标mid;

所以在查找56的时候,比较次数为3次。

下面给出代码

int search(int *arr,int n,int key)

{

  int low = 0, high = n-1;

  while(low<=high)

  {

    mid = (low+high)/2;

    if(arr[mid] == key)

      return mid;

    if(arr[mid]<key)

      low = mid + 1;

    else

      high = mid - 1;

  }

  return -1;

}

时间: 2024-10-07 05:06:41

二分法的查找图解的相关文章

数据结构——二分查找【转】

转自: http://www.lishiyu.cn/post/45.html 二分法(折半查找) -----------效率高,但要求序列必须有序-->使用范围小了 15/2取7不是8 /* * 二分查找算法 --- 递归算法 * */ int binSearch( int array[], int low ,int high, int key) { if(low<=high) { int mid =(low + high)/2; if(key == array[mid]) return mi

Pie--hdu1969(二分法)

Pie Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6158    Accepted Submission(s): 2343 Problem Description My birthday is coming up and traditionally I'm serving pie. Not just one pie, no, I h

二分法的学习

1.二分法的查找 一般而言,二分法是在数组当中,且数组的内部也是已经做好了从大到小或者从小到大的排序了,我们需要在这些排序中找到我们需要的数值.   int binart(int *a, int key, int n) { int left = 0, right = n - 1,mid = 0; mid = (left + right) / 2; while ((left<right)&& a[mid]!=key) { if (a[mid]<key) { left = mid

利用二分法实现插入排序算法(二分法使用递归来实现)

最近在看<算法导论>这本书,在练习题当中发现了这样的一个问题:使用二分查找法来实现插入排序,由于之前的内容当中有讲解二分法的递归实现,所以在这便将它们结合起来希望解决这个问题.闲话不多说了,直接上代码: // Algrithms.cpp : 定义控制台应用程序的入口点. // //使用二分法来完成插入排序,并且使用递归算法来完成二分法 #include "stdafx.h" int Binary_Divide(int A[], int low, int height, in

TOJ 3750: 二分查找

3750: 二分查找   Time Limit(Common/Java):3000MS/9000MS     Memory Limit:65536KByteTotal Submit: 1925            Accepted:759 Description 将n个从小到大排序的整数(n<1000000)从1~n进行编号,并一个待查找的整数m,请使用二分法进行查找. Input 输入包括3行,第一行为整数n,第二行包括n个整数,以空格分隔,第三行为整数m. Output 如果能够在序列中找

数据结构与算法-LeetCode练习二分查找应用

LeetCode 153. Find Minimum in Rotated Sorted Array 查找循环排序数组的最小元素(循环排序数组可以理解,一个环状数组(0,1,2,4,5,6,7),从其中一个元素断开后4,5,6,7,0,1,2). 查找一个数组的最小原始,我们知道最简单的方式就是循环遍历其中数字,时间复杂度O(n)肯定能找到这个元素.我们看循环排序数组的结构,我们发现我们的数组还不完全是一个乱序数组,我们通过分析数组的规律,我们可以看的出,我们的数组还是局部有序的,我们的数组可以

学underscore在数组中查找指定元素

前言 在开发中,我们经常会遇到在数组中查找指定元素的需求,可能大家觉得这个需求过于简单,然而如何优雅的去实现一个 findIndex 和 findLastIndex.indexOf 和 lastIndexOf 方法却是很少人去思考的.本文就带着大家一起参考着 underscore 去实现这些方法. 在实现前,先看看 ES6 的 findIndex 方法,让大家了解 findIndex 的使用方法. findIndex ES6 对数组新增了 findIndex 方法,它会返回数组中满足提供的函数的

SUMMARY | 二分查找

package Search; public class biSearch { //标准的二分查找 public static int stdBiSearch(int[] array,int keyValue) { int length=array.length; int left=0,right=length-1; while(left<=right){ int mid=(left+right)/2; if(keyValue<array[mid]) right=mid-1; else if(

旋转数组中查找最小值-剑指Offer11

1.题目简介 求一个旋转数组的最小值.( 把一个数组从最开始的若干个元素搬到数组的末尾,即为旋转数组.) 输入:一个递增排序数组的旋转 输出:数组的最小值 例子:数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1. 2.思路分析 最直观的解法是从头到尾顺序遍历,这种方法的时间复杂度为O(n).这里并没有用到旋转数组的知识,显然不合题意. 结合提议,旋转数组从有序数组中的得来的,经过旋转后得到的两个部分也为有序的.在有序数组中查找首选二分法,可以把时间复杂度变为O(n