全网精简版JS数据结构——搜索算法

搜索算法就是找想要元素的下标

顺序搜索

将每一个元素和要找的元素比较,最低效

  //顺序搜索
  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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值