Skip to content
索引

基础

二分查找

二分查找的基本思想是将n个元素分成大致相等的两部分,取arr[n/2]中间值与x做比较,如果x=arr[n/2],则找到x,算法结束;如果x<arr[n/2],则只要在数组arr的左半部分继续查找x;如果x>arr[n/2],则只要在数组arr的右半部分查找x

arr是所要查找的数组,x是要查找的元素

js
/**
 * 二分查找
 * @param arr 查找的数组
 * @param x 查找的元素
 * @returns 查找到返回数组下标,否则返回-1
 */
function binarySearch(arr, x) {
  let low = 0 // 首下标
  let high = arr.length - 1 // 尾下标
  // 只要查找区间起始点和结束点中间还有值(要包括两值相同的情况),就继续进行查找
  while (low <= high) {
    const mid = (low + high) / 2 // 确定中间值下标
    //如果查找值等于中间值
    if (x == arr[mid]) {
      return mid // 则这个mid值,就是查找到的数组下标
    }
    //如果查找值小于中间值
    else if (x < arr[mid]) {
      high = mid - 1 // 则在左半部分查找,需要重新确认区间high的位置
    }
    // 否则查找值大于中间值
    else {
      low = mid + 1 // 则在右半部分查找,需要重新确认区间low的位置
    }
  }
  return -1 //没有查找到,返回-1
}
const arr = [1, 3, 5, 6, 7, 8, 9]
const x = 7
console.log(binarySearch(arr, x))
/**
 * 二分查找
 * @param arr 查找的数组
 * @param x 查找的元素
 * @returns 查找到返回数组下标,否则返回-1
 */
function binarySearch(arr, x) {
  let low = 0 // 首下标
  let high = arr.length - 1 // 尾下标
  // 只要查找区间起始点和结束点中间还有值(要包括两值相同的情况),就继续进行查找
  while (low <= high) {
    const mid = (low + high) / 2 // 确定中间值下标
    //如果查找值等于中间值
    if (x == arr[mid]) {
      return mid // 则这个mid值,就是查找到的数组下标
    }
    //如果查找值小于中间值
    else if (x < arr[mid]) {
      high = mid - 1 // 则在左半部分查找,需要重新确认区间high的位置
    }
    // 否则查找值大于中间值
    else {
      low = mid + 1 // 则在右半部分查找,需要重新确认区间low的位置
    }
  }
  return -1 //没有查找到,返回-1
}
const arr = [1, 3, 5, 6, 7, 8, 9]
const x = 7
console.log(binarySearch(arr, x))

时间复杂度与空间复杂度

时间复杂度并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度

时间复杂度与空间复杂度:

https://blog.csdn.net/weixin_39565332/article/details/110868780

markdown数学公式:

https://blog.csdn.net/qq_43713303/article/details/105711878

递归的时间复杂度:

https://blog.csdn.net/wtlll/article/details/124164149

$$ 一层for循环时间复杂度O(n) $$

$$

二层for循环时间复杂度 O(n^2) $$

Released under the MIT License.