順序搜索
順序或是線性搜索都是最基本的搜索算法,它的機(jī)制是厚脉,將每一個(gè)數(shù)據(jù)結(jié)構(gòu)中的元素和我們要找的元素做一個(gè)比較,搜索算法是效率最低的一種搜索算法胶惰。
arr = [5,4,3,2,1];
let sequentialSearch = function (item,arr){
for(let i = 0; i < arr.length; i++){
if(item === arr[i]){
return i;
}
}
return -1;
}
let res = sequentialSearch(3,arr);
console.log(res);
上面的算法中如果找到了搜索項(xiàng)傻工,就會(huì)返回搜索項(xiàng)的下標(biāo),如果沒有找到該項(xiàng)孵滞,就會(huì)返回-1中捆,表示索引不存在,當(dāng)然也可以考慮返回null或是false坊饶。
順序查找的示意圖
二分搜索
二分搜索的做法的原理有一點(diǎn)類似于猜數(shù)字的游戲泄伪,就是有一個(gè)人說:我想到了一個(gè)1到100中的數(shù)字,我們沒回應(yīng)一個(gè)數(shù)字匿级,那個(gè)人就會(huì)回應(yīng)說這個(gè)數(shù)字是高了蟋滴、低了、還是對(duì)了根蟹。
這個(gè)算法有一個(gè)要求脓杉,就是這個(gè)被搜索的數(shù)據(jù)結(jié)構(gòu)已經(jīng)排序了,下面是這個(gè)算法需要遵循的步驟:
(1)選擇數(shù)組的中間值
(2)如果選中值是待搜索值简逮,那么算法就執(zhí)行完畢了(值找到了)球散。
(3)如果待搜索值比選中值小,就返回步驟1并在選中值左邊的子數(shù)組中查找散庶。
(4)如果待搜索值比選中值大蕉堰,就返回步驟1并在選中值右邊的子數(shù)組中查找。
let arr2 = [10,9,8,7,6,5,4,3,2,1];
let binarySearch = function (item,arr){
let low = 0;
high = arr2.length - 1;
let middle,curElement;
while(low <= high){
middle = Math.floor((low+high)/2);
curElement = arr2[middle];
if(curElement < item){
low = middle + 1;
}else if(curElement > item){
high = middle -1;
}else{
return middle
}
}
return -1;
};
let res = sequentialSearch(2,arr2);
console.log(res);
二分查找的示意圖