<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>二分查找</title>
	<atom:link href="https://www.aitaocui.cn/tag/261262/feed" rel="self" type="application/rss+xml" />
	<link>https://www.aitaocui.cn</link>
	<description>翡翠玉石爱好者聚集地</description>
	<lastBuildDate>Mon, 28 Nov 2022 12:11:51 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.1.1</generator>

<image>
	<url>https://www.aitaocui.cn/wp-content/uploads/2022/11/taocui.png</url>
	<title>二分查找</title>
	<link>https://www.aitaocui.cn</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>二分查找(计算机领域术语)</title>
		<link>https://www.aitaocui.cn/article/373474.html</link>
					<comments>https://www.aitaocui.cn/article/373474.html#respond</comments>
		
		<dc:creator><![CDATA[超狗]]></dc:creator>
		<pubDate>Mon, 28 Nov 2022 12:11:51 +0000</pubDate>
				<category><![CDATA[知识]]></category>
		<category><![CDATA[二分查找]]></category>
		<guid isPermaLink="false">https://www.aitaocui.cn/?p=373474</guid>

					<description><![CDATA[二分查找也称折半查找（Binary Search），它是一种效率较高的查找方法。但是，折半查找要求线性表必须采用顺序存储结构，而且表中元素按关键字有序排列。  查找过程 首先，假设...]]></description>
										<content:encoded><![CDATA[</p>
<article>
<p>二分查找也称折半查找（Binary Search），它是一种效率较高的查找方法。但是，折半查找要求线性表必须采用顺序存储结构，而且表中元素按关键字有序排列。 </p>
</p>
</article>
<p><img decoding="async" src="https://www.aitaocui.cn/wp-content/uploads/2022/08/20220828_630baf61351ea.png" /></p>
<article>
<h1>查找过程</h1>
<p>首先，假设表中元素是按升序排列，将表中间位置记录的关键字与查找关键字比较，如果两者相等，则查找成功；否则利用中间位置记录将表分成前、后两个子表，如果中间位置记录的关键字大于查找关键字，则进一步查找前一子表，否则进一步查找后一子表。重复以上过程，直到找到满足条件的记录，使查找成功，或直到子表不存在为止，此时查找不成功。</p>
</p>
<div></div>
</p>
<h1>算法要求</h1>
<p>1.必须采用顺序存储结构。</p>
<p>2.必须按关键字大小有序排列。</p>
<h1>比较次数</h1>
<p>计算公式：</p>
<p>当顺序表有n个关键字时：</p>
<p>查找失败时，至少比较a次关键字；查找成功时，最多比较关键字次数是b。</p>
<p>注意：a,b,n均为正整数。</p>
<div></div>
<h1>算法复杂度</h1>
<p>二分查找的基本思想是将n个元素分成大致相等的两部分，取a[n/2]与x做比较，如果x=a[n/2],则找到x,算法中止；如果x&lt;a[n/2],则只要在数组a的左半部分继续搜索x,如果x&gt;a[n/2],则只要在数组a的右半部搜索x.</p>
<p>时间复杂度即是while循环的次数。</p>
<p>总共有n个元素，</p>
<p>渐渐跟下去就是n,n/2,n/4,&#8230;.n/2^k（接下来操作元素的剩余个数），其中k就是循环的次数</p>
<p>由于你n/2^k取整后&gt;=1</p>
<p>即令n/2^k=1</p>
<p>可得k=log2n,（是以2为底，n的对数）</p>
<p>所以时间复杂度可以表示O(h)=O(log2n)</p>
<p>下面提供一段二分查找实现的伪代码:</p>
<p>BinarySearch(max,min,des)</p>
<p>mid-&lt;(max+min)/2</p>
<p>while(min&lt;=max)</p>
<p>mid=(min+max)/2</p>
<p>if mid=des then</p>
<p>return mid</p>
<p>elseif mid &gt;des then</p>
<p>max=mid-1</p>
<p>else</p>
<p>min=mid+1</p>
<p>return max</p>
<p>折半查找法也称为二分查找法，它充分利用了元素间的次序关系，采用分治策略，可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是：（这里假设数组元素呈升序排列）将n个元素分成个数大致相同的两半，取a[n/2]与欲查找的x作比较，如果x=a[n/2]则找到x，算法终止；如 果x&lt;a[n/2]，则我们只要在数组a的左半部继续搜索x；如果x&gt;a[n/2]，则我们只要在数组a的右 半部继续搜索x。</p>
<h1>代码示例</h1>
<table style="width:782px">
<caption>C#代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>public static int Method(int[] nums, int low, int high, int target)</p>
<p>        {</p>
<p>            while (low &lt;= high)</p>
<p>            {</p>
<p>                int middle = (low + high) / 2;</p>
<p>                if (target == nums[middle])</p>
<p>                {</p>
<p>                    return middle;</p>
<p>                }</p>
<p>                else if (target &gt; nums[middle])</p>
<p>                {</p>
<p>                    low = middle + 1;</p>
<p>                }</p>
<p>                else if (target &lt; nums[middle])</p>
<p>                {</p>
<p>                    high = middle &#8211; 1;</p>
<p>                }</p>
<p>            }</p>
<p>            return -1;</p>
<p>        }</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>Go源代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
<p>31</p>
<p>32</p>
<p>33</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>func binarySearch(checkSlice []int, findVal int) int {</p>
<p> </p>
<p>    pos := -1</p>
<p> </p>
<p>    left, right := 0, len(checkSlice)  //此处right长度不减1 ， 如果最大值为查找值，此处减一代码进入死循环</p>
<p> </p>
<p>Loop:</p>
<p> </p>
<p>    for {</p>
<p> </p>
<p>        if(left &gt;= right){</p>
<p>            break Loop</p>
<p>        }</p>
<p> </p>
<p>        mid := (left + right) / 2</p>
<p> </p>
<p>        switch true {</p>
<p> </p>
<p>        case checkSlice[mid] &lt; findVal :</p>
<p>            left = mid</p>
<p>        case checkSlice[mid] == findVal :</p>
<p>            pos = mid</p>
<p>            break Loop</p>
<p>        case checkSlice[mid] &gt; findVal :</p>
<p>            right = mid</p>
<p> </p>
<p>        }</p>
<p> </p>
<p>    }</p>
<p> </p>
<p>    return pos</p>
<p> </p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>Go源代码修正</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>func BinarySearch(n []int, target int) int {</p>
<p>   length := len(n)   </p>
<p>   low := 0   </p>
<p>   high := length &#8211; 1</p>
<p>   for low &lt;= high {</p>
<p>         mid := (low + high) / 2      </p>
<p>         if n[mid] &gt; target {</p>
<p>             high = mid &#8211; 1</p>
<p>         } else if n[mid] &lt; target {</p>
<p>             low = mid + 1      </p>
<p>         } else {         </p>
<p>             return mid      </p>
<p>         }   </p>
<p>    }</p>
<p>    return -1</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>Swift源代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>func binarySearch&lt;T: Comparable&gt;(_ a: [T], key: T) -&gt; Int? {    </p>
<p>    var lowerBound = 0    </p>
<p>    var upperBound = a.count    </p>
<p>    while lowerBound &lt; upperBound {        </p>
<p>        let midIndex = lowerBound + (upperBound &#8211; lowerBound) / 2        </p>
<p>        if a[midIndex] == key {            </p>
<p>            return midIndex        </p>
<p>        } else if a[midIndex] &lt; key {            </p>
<p>            lowerBound = midIndex + 1        </p>
<p>        } else {            </p>
<p>            upperBound = midIndex        </p>
<p>        }    </p>
<p>    }    </p>
<p>    return nil</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>Python源代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>def bin_search(data_list, val):    </p>
<p>    low = 0                         # 最小数下标    </p>
<p>    high = len(data_list) &#8211; 1       # 最大数下标    </p>
<p>    while low &lt;= high:        </p>
<p>        mid = (low + high) // 2     # 中间数下标        </p>
<p>        if data_list[mid] == val:   # 如果中间数下标等于val, 返回            </p>
<p>            return mid        </p>
<p>        elif data_list[mid] &gt; val:  # 如果val在中间数左边, 移动high下标            </p>
<p>            high = mid &#8211; 1        </p>
<p>        else:                       # 如果val在中间数右边, 移动low下标            </p>
<p>            low = mid + 1    </p>
<p>    return # val不存在, 返回None</p>
<p>ret = bin_search(list(range(1, 10)), 3)</p>
<p>print(ret)</p>
</td>
</tr>
</table>
<p>以上参考资料来源于</p>
<p>pascal源代码</p>
<table style="width:782px">
<caption>第一种</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>programjjzx(input,output);</p>
<p>var</p>
<p>a:array[1..10]ofinteger;</p>
<p>i,j,n,x:integer;</p>
<p>begin</p>
<p>[&#x27;输入10个从小到大的数：&#x27;]</p>
<p>for i:=1 to 10 do read(a[i]);</p>
<p>[&#x27;输入要查找的数：&#x27;]</p>
<p>readln(x);</p>
<p>i:=1;n:=10;j:=trunc((i+n)/2);</p>
<p>repeat</p>
<p>if a[j]&gt;x then</p>
<p>begin</p>
<p>n:=j-1;j:=trunc((i+n)/2)</p>
<p>end</p>
<p>else if a[j]&lt;x then</p>
<p>begin</p>
<p>i:=j+1;j:=trunc((i+n)/2)</p>
<p>end;</p>
<p>until(a[j]=x)or(i&gt;=n);{为什么是这个结束循环条件——i&gt;n表示所查找的范围已经空了（就是没找到）}</p>
<p>if a[j]=x then</p>
<p>writeln(&#x27;查找成功！位置是：&#x27;,j:3)</p>
<p>else</p>
<p>writeln(&#x27;查找失败，数组中无此元素！&#x27;)</p>
<p>end.</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>第二种</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>var a:array[1..100001] of longint;</p>
<p>    n,m,i,t:longint;</p>
<p>     </p>
<p>function search(k:longint):longint;</p>
<p>var l,r,mid:longint;</p>
<p>begin</p>
<p> l:=1;</p>
<p> r:=n;</p>
<p> mid:=(l+r) div 2;</p>
<p>  while (a[mid]&lt;&gt;k) and (l&lt;=r) do</p>
<p>  begin</p>
<p>   if a[mid]&gt;k then r:=mid-1</p>
<p>    else l:=mid+1;</p>
<p>   mid:=(l+r) div 2;</p>
<p>  end;</p>
<p> if l&gt;r then exit(0);</p>
<p> exit(mid);</p>
<p>end;</p>
<p> </p>
<p>begin</p>
<p> readln(n,m);</p>
<p> for i:=1 to n do read(a[i]);</p>
<p>  for i:=1 to n do</p>
<p>  begin</p>
<p>   read(t);</p>
<p>   if search(t)=0 then writeln(&#x27;no&#x27;)</p>
<p>    else writeln(search(t));</p>
<p>  end;</p>
<p>end.</p>
</td>
</tr>
</table>
<p>C和C++代码</p>
<p>&lt;C和C++的语法基本相同&gt;</p>
<p>循环实现</p>
</p>
<table style="width:782px">
<caption>第一种</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>int BinSearch(SeqList *R，int n,KeyType K)</p>
<p>{</p>
<p>    //在有序表R[0..n-1]中进行二分查找，成功时返回结点的位置，失败时返回-1</p>
<p>    int low=0,high=n-1,mid；     //置当前查找区间上、下界的初值</p>
<p>    while(low&lt;=high)</p>
<p>    {</p>
<p>        if(R[low].key==K)</p>
<p>            return low;</p>
<p>        if(R[high].key==k)</p>
<p>            return high;          //当前查找区间R[low..high]非空</p>
<p>        mid=low+(high-low)/2;</p>
<p>            /*使用(low+high)/2会有整数溢出的问题</p>
<p>            （问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时，</p>
<p>                这样，产生溢出后再/2是不会产生正确结果的，而low+((high-low)/2)</p>
<p>                不存在这个问题*/</p>
<p>        if(R[mid].key==K)</p>
<p>          return mid;             //查找成功返回</p>
<p>        if(R[mid].key&lt;K)</p>
<p>          low=mid+1;              //继续在R[mid+1..high]中查找</p>
<p>        else</p>
<p>          high=mid-1;             //继续在R[low..mid-1]中查找</p>
<p>    }</p>
<p>    if(low&gt;high)</p>
<p>        return -1;//当low&gt;high时表示所查找区间内没有结果，查找失败</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>第二种</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>int bsearchWithoutRecursion(int array[],int low,int high,int target)</p>
<p>{</p>
<p>    while(low&lt;=high)</p>
<p>        {</p>
<p>            int mid=low+(high-low)/2;//还是溢出问题</p>
<p>            if(array[mid]&gt;target)</p>
<p>                high=mid-1;</p>
<p>            else if(array[mid]&lt;target)</p>
<p>            low=mid+1;</p>
<p>            else</p>
<p>                return mid;</p>
<p>        }</p>
<p>    return-1;</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>第三种</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>int binSearch(const int *Array,int start,int end,int key)</p>
<p>{</p>
<p>        int left,right;</p>
<p>        int mid;</p>
<p>        left=start;</p>
<p>        right=end;</p>
<p>        while(left&lt;=right)</p>
<p>             </p>
<p>        {</p>
<p>                    mid=left+(right-left)/2;//还是溢出问题</p>
<p>                    if(key==Array[mid])  return mid;</p>
<p>                    else if(key&lt;Array[mid]) right=mid-1;</p>
<p>                    else if(key&gt;Array[mid]) left=mid+1;</p>
<p>                 </p>
<p>        }</p>
<p>        return -1;</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>JavaScript</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>function binarySearch(arr,target){</p>
<p>    if(!arr.length) return -1;// 考虑边界值</p>
<p>    if(arr.length == 1)return 0;//只有一位无需进入循环</p>
<p>    let start = 0;</p>
<p>    let end = arr.length-1;</p>
<p>    while(start &lt;= end){</p>
<p>        let mid = Math.floor((start + end) / 2);//取中位数，可能除不尽向下取整</p>
<p>        if(arr[mid] === target){</p>
<p>            return mid;</p>
<p>        }else if(target &gt; arr[mid]){// 若目标值大于中位值</p>
<p>            start = mid +1 //则说明目标值在更右侧，将初始下标右移至中位数右侧，再次循环</p>
<p>        }else{// 若目标值小于中位值</p>
<p>            end = mid -1 //则说明目标值在更左侧，将结束下标左移至中位数左侧，再次循环</p>
<p>        }</p>
<p>    }</p>
<p>    return -1</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>递归实现（可直接编译）</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>#include&lt;iostream&gt;</p>
<p>using namespace std;</p>
<p>int a[100]={1,2,3,5,12,12,12,15,29,55};//数组中的数（由小到大）</p>
<p>int k;//要找的数字</p>
<p>int found(int x,int y)</p>
<p>{</p>
<p>    int m=x+(y-x)/2;</p>
<p>    if(x&gt;y)//查找完毕没有找到答案，返回-1</p>
<p>        return -1;</p>
<p>    else</p>
<p>    {</p>
<p>        if(a[m]==k)</p>
<p>            return m;//找到!返回位置.</p>
<p>        else if(a[m]&gt;k)</p>
<p>            return found(x,m-1);//找左边</p>
<p>         else</p>
<p>            return found(m+1,y);//找右边</p>
<p>    }</p>
<p>}</p>
<p>int main()</p>
<p>    {</p>
<p>        cin&gt;&gt;k;//输入要找的数字c语言把cin换为scanf即可</p>
<p>        cout&lt;&lt;found(0,9);//从数组a[0]到a[9]c语言把cout换为printf即可</p>
<p>        return 0;</p>
<p>    }</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>Java代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>public static int binarySearch(Integer[] srcArray, int des) {</p>
<p>    //定义初始最小、最大索引</p>
<p>    int start = 0;</p>
<p>    int end = srcArray.length &#8211; 1;</p>
<p>    //确保不会出现重复查找，越界</p>
<p>    while (start &lt;= end) {</p>
<p>        //计算出中间索引值</p>
<p>        int middle = (end + start)&gt;&gt;&gt;1 ;//防止溢出</p>
<p>        if (des == srcArray[middle]) {</p>
<p>            return middle;</p>
<p>        //判断下限</p>
<p>        } else if (des &lt; srcArray[middle]) {</p>
<p>            end = middle &#8211; 1;</p>
<p>        //判断上限</p>
<p>        } else {</p>
<p>            start = middle + 1;</p>
<p>        }</p>
<p>    }</p>
<p>    //若没有，则返回-1</p>
<p>    return -1;</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>AAuto代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
<p>22</p>
<p>23</p>
<p>24</p>
<p>25</p>
<p>26</p>
<p>27</p>
<p>28</p>
<p>29</p>
<p>30</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>//二分查找</p>
<p>functionbinSearch(t,v){</p>
<p>varp=#t;</p>
<p>varp2;</p>
<p>varb=0;</p>
<p>do{</p>
<p>p2=p;</p>
<p>p=b+math.floor((p-b)/2)//二分折半运算</p>
<p>if(p==b)return;</p>
<p>if(t[p]&lt;v){//判断下限</p>
<p>b=p;</p>
<p>p=p2;</p>
<p>}</p>
<p>}while(t[p]&gt;v)//判断上限</p>
<p>returnt[p]==v&amp;&amp;p;</p>
<p>}</p>
<p>//测试</p>
<p>tab={}</p>
<p>//创建数组，每个元素都是随机数</p>
<p>for(i=1;10;1){</p>
<p>tab[i]=math.random(1,10000)</p>
<p>}</p>
<p>//插入一个已知数</p>
<p>table.push(tab,5632)</p>
<p>//排序</p>
<p>table.sort(tab)</p>
<p>io.open()</p>
<p>io.print(&quot;数组&quot;,table.tostring(tab))</p>
<p>io.print(&quot;使用二分查找，找到5632在位置：&quot;,binSearch(tab,5632))</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>PHP代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>function binsearch($x,$a){</p>
<p>    $c=count($a);</p>
<p>    $lower=0;</p>
<p>    $high=$c-1;</p>
<p>    while($lower&lt;=$high){</p>
<p>        $middle=intval(($lower+$high)/2);</p>
<p>        if($a[$middle]&gt;$x){</p>
<p>            $high=$middle-1;</p>
<p>        } elseif($a[$middle]&lt;$x){</p>
<p>            $lower=$middle+1;</p>
<p>        } else{</p>
<p>            return $middle;</p>
<p>        }</p>
<p>    }</p>
<p>    return -1;</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>AS3代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>publicstaticfunctionbinSearch(list:Array,low:int,high:int,key:int):int{</p>
<p>if(low&gt;high)</p>
<p>return-1;</p>
<p>varmid:int=low+int((high-low)/2);</p>
<p>varindex:int=-1</p>
<p>if(list[mid]==key){</p>
<p>index=mid;</p>
<p>}elseif(list[mid]&lt;key){</p>
<p>low=mid+1;</p>
<p>index=binSearch(list,low,high,key);</p>
<p>}else{</p>
<p>high=mid-1;</p>
<p>index=binSearch(list,low,high,key);</p>
<p>}returnindex;</p>
<p>}</p>
</td>
</tr>
</table>
<table style="width:782px">
<caption>JavaScript代码</caption>
<colgroup>
<col width="391" />
<col width="391" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>var Arr = [3, 5, 6, 7, 9, 12, 15];</p>
<p>function binary(find, arr, low, high) {</p>
<p>    if (low &lt;= high) {</p>
<p>        if (arr[low] == find) {</p>
<p>            return low;</p>
<p>        }</p>
<p>        if (arr[high] == find) {</p>
<p>            return high;</p>
<p>        }</p>
<p>        var mid = Math.ceil((high + low) / 2);</p>
<p>        if (arr[mid] == find) {</p>
<p>            return mid;</p>
<p>        } else if (arr[mid] &gt; find) {</p>
<p>            return binary(find, arr, low, mid &#8211; 1);</p>
<p>        } else {</p>
<p>            return binary(find, arr, mid + 1, high);</p>
<p>        }</p>
<p>    }</p>
<p>    return -1;</p>
<p>}</p>
<p>binary(15, Arr, 0, Arr.length &#8211; 1);</p>
</td>
</tr>
</table>
<table style="width:650px">
<colgroup>
<col width="325" />
<col width="325" /></colgroup>
<tr>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>1</p>
<p>2</p>
<p>3</p>
<p>4</p>
<p>5</p>
<p>6</p>
<p>7</p>
<p>8</p>
<p>9</p>
<p>10</p>
<p>11</p>
<p>12</p>
<p>13</p>
<p>14</p>
<p>15</p>
<p>16</p>
<p>17</p>
<p>18</p>
<p>19</p>
<p>20</p>
<p>21</p>
</td>
<td colspan="1" rowspan="1" style="border-left:1px solid #000000;border-right:1px solid #000000;border-bottom:1px solid #000000;border-top:1px solid #000000;padding-left:7px;padding-right:7px">
<p>/*二分查找：前提，该数组已经是一个有序数组，必须先排序，再查找。*/</p>
<p>function binarySearch(&amp;$array,$findVal,$leftIndex,$rightIndex){</p>
<p>    $middleIndex=round(($rightIndex+$leftIndex)/2);</p>
<p>    if($leftIndex&gt;$rightIndex){</p>
<p>        echo&#x27;查无此数&lt;br/&gt;&#x27;;</p>
<p>        return;</p>
<p>    }</p>
<p>    if($findVal&gt;$array[$middleIndex]){</p>
<p>        binarySearch($array,$findVal,$middleIndex+1,$rightIndex);</p>
<p>    }elseif($findVal&lt;$array[$middleIndex]){</p>
<p>        binarySearch($array,$findVal,$leftIndex,$middleIndex-1);</p>
<p>    }else{</p>
<p>        echo&quot;找到数据:index=$middleIndex;value=$array[$middleIndex]&lt;br/&gt;&quot;;</p>
<p>        if($array[$middleIndex+1]==$array[$middleIndex]&amp;&amp;$leftIndex&lt;$rightIndex){</p>
<p>            binarySearch($array,$findVal,$middleIndex+1,$rightIndex);</p>
<p>        }</p>
<p>        if($array[$middleIndex-1]==$array[$middleIndex]&amp;&amp;$leftIndex&lt;$rightIndex){</p>
<p>            binarySearch($array,$findVal,$leftIndex,$middleIndex-1);</p>
<p>        }</p>
<p>    }</p>
<p>}</p>
</td>
</tr>
</table>
</article>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
<div class="mt-3 mb-3" style="max-width: 770px;height: auto;">
                                    </div>
]]></content:encoded>
					
					<wfw:commentRss>https://www.aitaocui.cn/article/373474.html/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
