二分查找
二分查找又名Binary Search,其采用折半的查找方式,实现对有序元素的快速查找。
相信看到上面二分查找的定义,读者很容易就能想到,二分查找有一个非常重要的前提条件,那就是其需要已经排序好的数列。这样,我们折半查找可以缩小查找的次数,更加的高效。
其具体原理:在数列中取中间下标值mid的元素e,进行查找元素key的比较。如果相等即查找成功,如果不等,大于就只需要在后半部分查找,小于需要在前半部分查找。
不管是前半部分还是后半部分,我们在取其中间值mid,进行比较,依次类推,直到mid值等于key结束查找。
其时间复杂度为:O(log2n) 。
图解二分查找
假设,我们现在有一个数列[1,3,5,7,9,11,13],我们需要查找13所在的索引位置,那么的步骤应该分几步?
如上图所示,我们这里先取中间索引值3,与13进行比较。13不等于list[3],且大于它,接下来我们需要取后半部分进行查找。
同样的,在取后半部分中间值进行比较,依然大于它。最后,我们只剩下一个值,如果相等,返回查找到的索引,如果不等,返回查询不到。
实战:二分查找
了解其具体的原理之后,我们接下来通过Python来实现其二分查找的具体效果。示例代码如下所示:
def binary_search(my_list, key): left = 0 right = len(my_list) while left <= right: mid = (right - left) // 2 if my_list[left + mid] < key: left = left + mid + 1 elif my_list[left + mid] > key: right = left + mid - 1 else: return left + mid return "None" if __name__ == "__main__": my_list = [1, 3, 5, 7, 9, 11, 13] print("二分查找的原始数列:", my_list) print("二分查找的返回结果:", binary_search(my_list, 3))
运行之后,效果如下: