欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法示例

 更新時(shí)間:2018年08月06日 10:24:16   作者:夜色蕪染  
這篇文章主要介紹了JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法,結(jié)合具體問題描述了折半查找算法的原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法。分享給大家供大家參考,具體如下:

一、問題描述:

在一個(gè)升序數(shù)組中,使用折半查找得到要查詢的值的索引位置。如:

var a=[1,2,3,4,5,6,7,8,9];
search(a,3);//返回2
search(a,1);//左邊界,返回0
search(a,9);//右邊界,返回8
search(a,0);//比最小的值還小,返回"您查找的數(shù)值不存在"
search(a,10);//比最大的值還大,返回"您查找的數(shù)值不存在"

注:折半查找必須在有序數(shù)組中才有效,無序的數(shù)組不能實(shí)現(xiàn)查找功能。比如:在[10,5,6,7,8,9,20]中查找10,中間索引位置的值為7,比較得出7比10小,因而應(yīng)該在右子數(shù)組中查找,實(shí)際上不可能找到10;

二、我的實(shí)現(xiàn)

function search(arr,num) {
  var l=arr.length;
  var left=0;
  var right=l-1;
  var center=Math.floor((left+right)/2);
  while(left<=l-1&&right>=0){
    if (arr[center]==num) return center;
    if (left==right) return "您查找的數(shù)不存在";
    if (arr[center]>num) {
      right=center-1;
      center=Math.floor((left+right)/2);
    }else if (arr[center]<num) {
      left=center+1;
      center=Math.floor((left+right)/2);
    }
  }
}
var a=[1,2,3,4,5,6,7,8,9];
console.log(search(a,-2));

說明:

1、基本思路:

每次比較,如果數(shù)組中間索引位置的值比要查找的值大,就轉(zhuǎn)而在數(shù)組中間位置之前的子數(shù)組中查找;相反,如果數(shù)組中間索引位置的值比要查找的值大,就轉(zhuǎn)而在數(shù)組中間位置之后的子數(shù)組中查找;如果數(shù)組中間索引位置的值恰好等于要查找的值,就返回該索引位置。

2、left定義查找范圍的起始位置,right定義查找范圍的結(jié)束位置,center定義查找范圍的中間位置。

3、while中的邏輯說明:

(1)由于不知道具體查找查找多少次,while是比較好的選擇;

(2)循環(huán)結(jié)束條件:

a、一旦當(dāng)right小于0時(shí),就不再查找,再糾纏也不會(huì)有結(jié)果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找0,當(dāng)查找范圍變?yōu)?code>left=0,right=0,center=0時(shí),進(jìn)入while語句,由于arr[center]>0,故執(zhí)行

right=center-1;
center=Math.floor((left+right)/2);

得到right=-1此時(shí)應(yīng)不再進(jìn)入循環(huán);

b、一旦當(dāng)left>l-1時(shí),就不再查找,同樣再糾纏也不會(huì)有結(jié)果。例如:在a=[1,2,3,4,5,6,7,8,9]中查找10,當(dāng)查找范圍變?yōu)?code>left=8,right=8,center=8時(shí),進(jìn)入while語句,由于arr[center]<10,故執(zhí)行

left=center;
center=Math.floor((left+right)/2);

得到left=9,此時(shí)應(yīng)不再進(jìn)入循環(huán);

4、始終是通過center匹配到要查找的值;

5、Math.floor處理了查找范圍長度為偶數(shù)的情況;

6、當(dāng)left==right了,而arr[center]==num卻沒執(zhí)行,可以得出結(jié)論查找不到的;

7、當(dāng)arr[center]==num時(shí),整個(gè)函數(shù)都結(jié)束了,后面語句是不會(huì)執(zhí)行的。

上述代碼使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測試運(yùn)行結(jié)果如下:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 使用Typescript開發(fā)微信小程序的步驟詳解

    使用Typescript開發(fā)微信小程序的步驟詳解

    這篇文章主要介紹了使用Typescript開發(fā)微信小程序的步驟詳解,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • 微信小程序 行的刪除和增加操作實(shí)現(xiàn)詳解

    微信小程序 行的刪除和增加操作實(shí)現(xiàn)詳解

    這篇文章主要介紹了微信小程序 行的刪除和增加操作實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • uniapp頁面間傳參的幾種方法實(shí)例總結(jié)

    uniapp頁面間傳參的幾種方法實(shí)例總結(jié)

    在進(jìn)行頁面的跳轉(zhuǎn)的時(shí)候,往往需要我們將一些參數(shù)攜帶著傳遞過去,下面這篇文章主要給大家介紹了關(guān)于uniapp頁面間傳參的幾種方法,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • JavaScript變量Dom對(duì)象的所有屬性

    JavaScript變量Dom對(duì)象的所有屬性

    這篇文章主要介紹了JavaScript變量Dom對(duì)象的所有屬性,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • JavaScript中表格文件導(dǎo)出的實(shí)現(xiàn)示例

    JavaScript中表格文件導(dǎo)出的實(shí)現(xiàn)示例

    本文主要介紹了JavaScript中表格文件導(dǎo)出的實(shí)現(xiàn)示例,JavaScript中的Blob對(duì)象和a標(biāo)簽的download屬性是實(shí)現(xiàn)這一功能的關(guān)鍵,本文就來詳細(xì)的介紹一下,感興趣的可以了解一下
    2024-01-01
  • 建議大家看下JavaScript重要知識(shí)更新

    建議大家看下JavaScript重要知識(shí)更新

    建議大家看下JavaScript重要知識(shí)更新...
    2007-07-07
  • JS中setTimeout的巧妙用法前端函數(shù)節(jié)流

    JS中setTimeout的巧妙用法前端函數(shù)節(jié)流

    這篇文章主要介紹了JS中setTimeout的巧妙用法前端函數(shù)節(jié)流 的相關(guān)資料,需要的朋友可以參考下
    2016-03-03
  • 使用透明效果來自定義文件上傳按鈕控件樣式

    使用透明效果來自定義文件上傳按鈕控件樣式

    處于安全上的考慮,input[type="file"] 的文件選擇按鈕樣式并不能隨意修改(不過可以修改input 的透明度),可能會(huì)跟設(shè)計(jì)師的設(shè)計(jì)格格不入,這時(shí)可以使用透明效果來自定義上傳按鈕
    2012-12-12
  • element-ui的表單驗(yàn)證清除校驗(yàn)提示語的解決方案

    element-ui的表單驗(yàn)證清除校驗(yàn)提示語的解決方案

    對(duì)表單域中的數(shù)據(jù)進(jìn)行校驗(yàn)的時(shí)候,其中有一項(xiàng)比較特殊,不是簡單的輸入框,下拉框這些表單元素,而是自己寫的一個(gè)el-table的選擇彈窗,本文給大家介紹element-ui的表單驗(yàn)證如何清除校驗(yàn)提示語,感興趣的朋友一起看看吧
    2024-01-01
  • js使用canvas實(shí)現(xiàn)繪制月餅

    js使用canvas實(shí)現(xiàn)繪制月餅

    皓月當(dāng)空,月圓中秋,在這個(gè)傳統(tǒng)節(jié)日里,除了賞月、猜燈謎、賞花燈等習(xí)俗外,還有就是品嘗美味的月餅,本文就來使用canvas繪制一個(gè)精美的月餅吧
    2023-09-09

最新評(píng)論