基于JavaScript實(shí)現(xiàn)的折半查找算法示例
本文實(shí)例講述了基于JavaScript實(shí)現(xiàn)的折半查找算法。分享給大家供大家參考,具體如下:
折半查找也叫做二分查找,是針對(duì)有序表的一種查找方式,其思想如下:
將數(shù)組的第一個(gè)位置設(shè)為下邊界;
將數(shù)組的最后一個(gè)位置設(shè)為上邊界;
如果下邊界等于或小于上邊界,則做如下操作:
將中點(diǎn)設(shè)置為上邊界加下邊界之和除以二;
如果中點(diǎn)的元素小于查詢的值,則將下邊界設(shè)置為中點(diǎn)元素所在下標(biāo)加1;
如果中點(diǎn)的元素大于查詢的值,則將上邊界設(shè)置為中點(diǎn)元素所在下標(biāo)減1;
否則中點(diǎn)元素即為要查找的元素,可以進(jìn)行返回。
折半查找代碼如下:
function binSearch(arr,data){//折半查找,也叫二分查找
var upperBound=arr.length-1;
var lowerBound=0;
while(lowerBound<=upperBound){//未遍歷完
var mid=Math.floor((lowerBound+upperBound)/2);
document.write("當(dāng)前中點(diǎn)為:"+mid+'<br>');//記錄選中的中點(diǎn)
if(arr[mid]<data){
lowerBound=mid+1;
}else if(arr[mid]>data){
upperBound=mid-1;
}else{
return mid;
}
}
return -1;
}
那么出現(xiàn)了重復(fù)的,我們需要計(jì)數(shù)。計(jì)數(shù)的思想就是在找到點(diǎn)的位置左右開始遍歷,找到相同的則計(jì)數(shù),找到不同的則停止遍歷,代碼如下:
function count(arr,data){//計(jì)算重復(fù)出現(xiàn)的次數(shù)
var count=0;
var position=binSearch(arr,data);//找出值所在位置
if(position>-1){
count++;//找到后,往左右一次遍歷直到找到不同值后break
for(var i=position-1;i>0;i--){
if(arr[i]==data){
count++;
}else{
break;
}
}
for(var i=position+1;i<arr.length;i++){
if(arr[i]==data){
count++;
}else{
break;
}
}
}
return count;
}
最后是實(shí)驗(yàn):
//實(shí)驗(yàn)
var nums=[1,2,2,3,3,4,5,6,7,8,9,10,11];
var bool=binSearch(nums,3);
document.write("所在位置為:"+bool+"<br>");
document.write("含有個(gè)數(shù)為:"+count(nums,3));
//當(dāng)前中點(diǎn)為:6
//當(dāng)前中點(diǎn)為:2
//當(dāng)前中點(diǎn)為:4
//所在位置為:4
//當(dāng)前中點(diǎn)為:6
//當(dāng)前中點(diǎn)為:2
//當(dāng)前中點(diǎn)為:4
//含有個(gè)數(shù)為:2
完整代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>JavaScript折半查找</title>
</head>
<body>
<script type="text/javascript">
function binSearch(arr,data){//折半查找,也叫二分查找
var upperBound=arr.length-1;
var lowerBound=0;
while(lowerBound<=upperBound){//未遍歷完
var mid=Math.floor((lowerBound+upperBound)/2);
document.write("當(dāng)前中點(diǎn)為:"+mid+'<br>');//記錄選中的中點(diǎn)
if(arr[mid]<data){
lowerBound=mid+1;
}else if(arr[mid]>data){
upperBound=mid-1;
}else{
return mid;
}
}
return -1;
}
function count(arr,data){//計(jì)算重復(fù)出現(xiàn)的次數(shù)
var count=0;
var position=binSearch(arr,data);//找出值所在位置
if(position>-1){
count++;//找到后,往左右一次遍歷直到找到不同值后break
for(var i=position-1;i>0;i--){
if(arr[i]==data){
count++;
}else{
break;
}
}
for(var i=position+1;i<arr.length;i++){
if(arr[i]==data){
count++;
}else{
break;
}
}
}
return count;
}
//實(shí)驗(yàn)
var nums=[1,2,2,3,3,4,5,6,7,8,9,10,11];
var bool=binSearch(nums,3);
document.write("所在位置為:"+bool+"<br>");
document.write("含有個(gè)數(shù)為:"+count(nums,3));
//當(dāng)前中點(diǎn)為:6
//當(dāng)前中點(diǎn)為:2
//當(dāng)前中點(diǎn)為:4
//所在位置為:4
//當(dāng)前中點(diǎn)為:6
//當(dāng)前中點(diǎn)為:2
//當(dāng)前中點(diǎn)為:4
//含有個(gè)數(shù)為:2
</script>
</body>
</html>
運(yùn)行效果圖如下:

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
相關(guān)文章
普通web整合quartz跑定時(shí)任務(wù)的示例
這篇文章主要介紹了普通web整合quartz跑定時(shí)任務(wù),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-03-03
JavaScript中數(shù)組Array.sort()排序方法詳解
本篇文章主要介紹了JavaScript中數(shù)組Array.sort()的排序方法。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-03-03
一文總結(jié)JavaScript中常見的設(shè)計(jì)模式
在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語(yǔ)言的實(shí)現(xiàn)都是基于“類”。在程序設(shè)計(jì)中有很多實(shí)用的設(shè)計(jì)模式,而其中大部分語(yǔ)言的實(shí)現(xiàn)都是基于“類”。,本文將總結(jié)了JavaScript中常見的十五種設(shè)計(jì)模式,感興趣的朋友可以參考下2023-05-05
JavaScript 動(dòng)態(tài)添加表格行 使用模板、標(biāo)記
在客戶端使用JavaScript動(dòng)態(tài)添加表格行,先到網(wǎng)上找了相關(guān)的資料,發(fā)現(xiàn)有現(xiàn)成做好的組件,發(fā)現(xiàn)它只能夠滿足比較簡(jiǎn)單的要求。2009-10-10
JS數(shù)組進(jìn)階示例【數(shù)組的幾種函數(shù)用法】
這篇文章主要介紹了JS數(shù)組進(jìn)階,結(jié)合實(shí)例形式總結(jié)分析了數(shù)組的幾種常見函數(shù)基本用法,涉及JavaScript數(shù)組元素刪除、拼接、添加、倒序排列等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
JavaScript中輸出信息的方法(信息確認(rèn)框-提示輸入框-文檔流輸出)
這篇文章主要介紹了JavaScript中輸出信息的方法(信息確認(rèn)框-提示輸入框-文檔流輸出)的相關(guān)資料,需要的朋友可以參考下2016-06-06
微信小程序scroll-view實(shí)現(xiàn)上拉加載數(shù)據(jù)重復(fù)的解決方法
這篇文章主要為大家詳細(xì)介紹了微信小程序scroll-view實(shí)現(xiàn)上拉加載數(shù)據(jù)重復(fù)的解決方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
JS實(shí)現(xiàn)帶導(dǎo)航城市列表以及輸入搜索功能
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)帶導(dǎo)航城市列表以及輸入搜索功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

