二分查找是一个非常常用的算法,我们可以用 O(log n) 的时间在一个有序数组中查找一个值。bisect 模块使用二分查找算法 (bisection algorithm) 来对有序数组进行插入或查找操作。

bisect 模块包括 bisectinsort 方法。分别表示在有序数组中,返回二分查找插入该元素的位置、插入该元素到数组中。insort 方法不输出任何结果,但改变原数组。bisect_leftbisect_rightinsort_leftinsort_right 分别表示出现重复数值的情形,并选择返回最左侧插入位置或者最右侧插入位置,以及从最左侧插入元素和从最右侧插入元素。

data = [1, 3, 3, 3, 3, 5, 7, 9] # 以下讨论位的位置,从 0 开始。
bisect.bisect(data, 2) # 输出结果: 1。解释: 2 应该插入第 1 个位置。
bisect.bisect(data, 3) # 输出结果: 5。解释: 3 应该插入第 5 个位置。
bisect.bisect_left(data, 2) # 输出结果: 1。解释: 2 应该插入第 1 个位置。
bisect.bisect_left(data, 3) # 输出结果: 1。解释: 3 可以插入的最左侧位置是第 1 个位置。
bisect.bisect_right(data, 2) # 输出结果: 1。解释: 2 应该插入第 1 个位置。
bisect.bisect_right(data, 3) # 输出结果: 5。解释: 3 可以插入的最右侧位置是第 5 个位置。
bisect.insort(data, 2) # data 变为 [1, 2, 3, 3, 3, 3, 5, 7, 9]
data = [1, 3, 3, 3, 3, 5, 7, 9]
bisect.insort_left(data, 2) # data 变为 [1, 2, 3, 3, 3, 3, 5, 7, 9]
data = [1, 3, 3, 3, 3, 5, 7, 9]
bisect.insort_right(data, 2) # data 变为 [1, 2, 3, 3, 3, 3, 5, 7, 9]