2020-08-26

二分查找

描述

二分查找是一种算法,其输入是一个有序的元素列表(元素可比较),如果查找的元素包含在列表中,二分查找返回其位置,否则返回NULL

具体步骤

  1. 设置指针
    • l= 数组起点
    • r= 数组终点
    • m= (l+r)/2
  2. g = 目标值
    • 如果 g>[m] : l = m+1
    • 如果 g<[m] : r = m-1
    • 如果 g=[m] : 找到g在数组中的位置 m
  3. 如果 r<[l]: 数组中找不到 g,返回空值
    返回第3部继续执行

变形问题

有序数组旋转 [0,1,2,4,5,6,7] -> [2,4,5,6,7,0,1,] 后进行查找(思路仍然是二分查找),要求时间复杂度是O(logN)

解决方法:

1.找到数组中最小的点,并拆分成2个问题,用二分查找

具体步骤

  1. 设置指针
    • l= 数组起点
    • r= 数组终点
    • m= (l+r)/2
    • 如果 [m]<[l] :r = m
    • 如果 [m]>[l] : l = m
    • 如果 r-l<=1:
      • 如果 l<r : l是数组中最小点的位置,将l作为最小点 min记录,并跳到第四步
      • 否则 r 是数组中最小点的位置,将r作为最小点 min记录,并跳到第四步
    • 回到第二步
  2. 初始化查找
    • l = 数组起点
    • r = min
    • m = (1+r)/2
  3. 用普通的二分查找进行搜索,如果搜索到结果,则返回这个结果
  4. 初始化查找
    • l = min
    • r = 数组终点
    • m = (1+r)/2
  5. 回到第5步

2. 直接搜索

具体步骤

  1. 设置指针
    • l = 数组起点
    • r = 数组终点
    • m = (l+r)/2
    • g = 目标值
    • 如果 [m]<[l]: 说明右边是有序的
      • g > [m] 且 g<[r] : l = m+1
      • g = [m] : 位置m 是目标g的位置,并返回
      • 前面的都不满足: r = m - 1
    • 如果 [m]>[l]: 说明左边是有序的
      • g<[m] 且 g>[l] : r = m-1
      • g = [m] : 位置m 是目标g的位置,并返回
      • 前面的都不满足: l = m - 1
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。