javascript折半查找詳解
折半查找法:
在有序表中,把待查找數(shù)據(jù)值與查找范圍的中間元素值進(jìn)行比較,會(huì)有三種情況出現(xiàn):
1) 待查找數(shù)據(jù)值與中間元素值正好相等,則放回中間元素值的索引。
2) 待查找數(shù)據(jù)值比中間元素值小,則以整個(gè)查找范圍的前半部分作為新的查找范圍,執(zhí)行1),直到找到相等的值。
3) 待查找數(shù)據(jù)值比中間元素值大,則以整個(gè)查找范圍的后半部分作為新的查找范圍,執(zhí)行1),直到找到相等的值
4) 如果最后找不到相等的值,則返回錯(cuò)誤提示信息。
按照二叉樹來(lái)理解:中間值為二叉樹的根,前半部分為左子樹,后半部分為右子樹。折半查找法的查找次數(shù)正好為該值所在的層數(shù)。等概率情況下,約為
log2(n+1)-1
//Data為要查找的數(shù)組,x為待查找數(shù)據(jù)值,beg為查找范圍起始,last為查找范圍終止
//非遞歸法
int BiSearch(int data[], const int x, int beg, int last)
{
int mid;//中間位置
if (beg > last)
{
return -1;
}
while(beg <= last)
{
mid = (beg + last) / 2;
if (x == data[mid] )
{
return mid;
}
else if (data[mid] < x)
{
beg = mid + 1;
}
else if (data[mid] > x)
{
last = mid - 1;
}
}
return -1;
}
//遞歸法
int IterBiSearch(int data[], const int x, int beg, int last)
{
int mid = -1;
mid = (beg + last) / 2;
if (x == data[mid])
{
return mid;
}
else if (x < data[mid])
{
return IterBiSearch(data, x, beg, mid - 1);
}
else if (x > data[mid])
{
return IterBiSearch(data, x, mid + 1, last);
}
return -1;
}
//主函數(shù)
int _tmain(int argc, _TCHAR* argv[])
{
int data1[60] = {0};
int no2search = 45;
cout << "The array is : " << endl;
int siz = sizeof(data1)/sizeof(int);
for (int i = 0; i < siz; i++)
{
data1[i] = i;
cout << data1[i] << " ";
}
cout << endl;
int index = -1;
//index = BiSearch(data1, no2search, 0, siz);
index = IterBiSearch(data1, no2search, 0, siz);
cout << "Index of " << no2search << " is " << index << endl;
getchar();
return 0;
}
/**
* 折半查找字符在數(shù)組中的位置(有序列表)
* @param array 被檢索的數(shù)組
* @param x 要查找的字符
* @returns 字符在數(shù)組中的位置,沒(méi)找到返回-1
*/
function binarySearch(array,x){
var lowPoint=1;
var higPoint=array.length;
var returnValue=-1;
var midPoint;
var found=false;
while ((lowPoint<=higPoint)&&(!found)){
midPoint=Math.ceil((lowPoint+higPoint)/2);
//console.log(lowPoint+"===="+midPoint+"===="+higPoint);
if(x>array[midPoint-1]){
lowPoint=midPoint+1;
}
else if(x<array[midPoint-1]){
higPoint= midPoint-1;
}
else if(x=array[midPoint-1]){
found=true;
}
}
if(found){
returnValue=midPoint;
}
return returnValue;
}
/*var array2=[1,2,3,4,5,6,7,8,9,100,109];*/
var array2=['a','b','c','d','e','f','g'];
console.log(binarySearch(array2,'c'));
- javascript 折半查找字符在數(shù)組中的位置(有序列表)
- 基于JavaScript實(shí)現(xiàn)的折半查找算法示例
- javascript實(shí)現(xiàn)二分查找法實(shí)現(xiàn)代碼
- js實(shí)現(xiàn)的二分查找算法實(shí)例
- JavaScript使用二分查找算法在數(shù)組中查找數(shù)據(jù)的方法
- js基本算法:冒泡排序,二分查找的簡(jiǎn)單實(shí)例
- JS二分查找算法詳解
- JavaScript實(shí)現(xiàn)二分查找實(shí)例代碼
- JavaScript折半查找(二分查找)算法原理與實(shí)現(xiàn)方法示例
相關(guān)文章
JS實(shí)現(xiàn)鼠標(biāo)框選效果完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)鼠標(biāo)框選效果,可實(shí)現(xiàn)鼠標(biāo)點(diǎn)擊出現(xiàn)框選效果的功能,同時(shí)下方實(shí)時(shí)顯示框選大小,涉及javascript鼠標(biāo)事件的響應(yīng)與頁(yè)面元素的動(dòng)態(tài)運(yùn)算技巧,需要的朋友可以參考下2016-06-06ionic js 模型 $ionicModal 可以遮住用戶主界面的內(nèi)容框
這篇文章主要介紹了ionic js 模型 $ionicModal 可以遮住用戶主界面的內(nèi)容框的相關(guān)資料,需要的朋友可以參考下2016-06-06動(dòng)態(tài)加載JavaScript文件的兩種方法
第一種利用ajax方式,第二種是動(dòng)靜創(chuàng)建一個(gè)script標(biāo)簽,配置其src屬性,經(jīng)過(guò)把script標(biāo)簽拔出到頁(yè)面head來(lái)加載js,感樂(lè)趣的網(wǎng)友可以看下2016-04-04js拖拉表格實(shí)現(xiàn)內(nèi)容計(jì)算
這篇文章主要為大家詳細(xì)介紹了js拖拉表格實(shí)現(xiàn)內(nèi)容計(jì)算,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04基于BootStrap Metronic開發(fā)框架經(jīng)驗(yàn)小結(jié)【八】框架功能總體界面介紹
這篇文章主要介紹了基于BootStrap Metronic開發(fā)框架經(jīng)驗(yàn)小結(jié)【八】框架功能總體界面介紹 的相關(guān)資料,需要的朋友可以參考下2016-05-05js+css 實(shí)現(xiàn)遮罩居中彈出層(隨瀏覽器窗口滾動(dòng)條滾動(dòng))
本文為大家詳細(xì)介紹下使用js實(shí)現(xiàn)遮罩彈出層居中,且隨瀏覽器窗口滾動(dòng)條滾動(dòng),示例代碼如下,感興趣的朋友可以參考下2013-12-12