搜索算法就是找想要元素的下标
顺序搜索
将每一个元素和要找的元素比较,最低效
//顺序搜索
function searcn(arr,val){
for(let i=0;i<arr.length;i++){
if(val===arr[i]){
return i
}
return -1
}
}
二分搜索
从按从小到大的数组中最中间的数开始找,如果大就往右边,小就往左边。
function binarySearch(find,arr,start,end){
}
需要在函数中传入三个参数,分别是要找的数,数组,开始数字和结束数字。以为最中间的数是开头和结尾的索引值end和start相加除以2再加start的索引值
function quickStore() {
const { length } = arr
if (length < 2) {
return arr
}
let base = arr[0]
let minArr = arr.slice(1).filter(item => item >= base)
let maxArr = arr.slick(1).filter(item => item < base)
return quickStore(minArr).contact(base).contact(quickStore(maxArrft))
}
function binarySearch(find,arr,start,end){
start=start||0
end=end||arr.length-1
arr=quickStore(arr)
if(start<=end){
if(arr[start]===find)
return start
if(arr[end]===find)
return end
}
return -1
}
searcn([5,4,2,5,1,6,7],6)
封装一个快速排序的算法提前排好arr,处理找到数刚好是开头或者尾部的数
找到中间值:
let mid=(end-start)/2+start
设start为x,end结尾为y (x-y)/2+x=x/2+y/2
所以可以简化为
let mid=Math.ceil((end+start)/2)
完整代码
function binarySearch(find,arr,start,end){
start=start||0
end=end||arr.length-1
arr=quickStore(arr)
if(start<=end&&find>=arr[start]&&find<=arr[end]){
if(arr[start]===find)
return start
if(arr[end]===find)
return end
}
let mid=Math.ceil((end+start)/2)
if(arr[mid]==find){
return mid }
else if(arr[mid]>find){
return binarySearch(find,arr,start,mid)
}
else if(arr[mid]<find){
return binarySearch(find,arr,mid+1,end)
}
return -1
}
binarySearch([5,4,2,5,1,6,7],6)
内插搜索
改良版的二分搜索,二分总是检查mid位置上的值,而内插搜索根据要搜索的值检查数组中的不同地方,针对数字分布均匀的数,也需要提前按从小到大排好数组中的数字,和二分搜索差不多,只需要修改一句:把mid中间值改为
let mid=start+Math.floor(find -arr[start])/(arr[end]- find)*(end-start)