二分查找:
前提条件:
二分查找只能在有序的列表内进行查找
基本思想
1. 在一个有序的列表内,查找你想要的数字.
2. 先设定起始下标,与结束下标,然后取出中间下标的值
3. 让中间坐标的值,与要查找的值进行比对
1.如果中间值等于要查找的值,直接返回中间值
2.如果中间值,小于要查找的值,那么将中间值的下标加一,作为下一次查找的起始下标
3.如果中间值,大于要查找的值,那么将中间值的下标减一作为下一次查找的终止下标
4. 按照此原理直到找到为止
时间复杂度:
顾名思义: 劈半查找, 每次只寻找当前序列的一半, 总会被劈成一个个长度为一的小序列, 此过程需要n步
即: 时间复杂度 --> O(log2^n) --> (是以2为底,n的对数)--> O(logn)
精简版:
def bin_search(data, find_num): first = 0 last = len(data)-1 while first <= last: mid = (first+last)//2 if data[mid] == find_num: return mid if data[mid] < find_num: first = mid + 1 if data[mid] > find_num: last = mid - 1
注释版:
def bin_search(data, find_num): # 起始下标 first = 0 # 终止下标 last = len(data)-1 # 如果这个序列不为空就要一直查找 while first <= last: # 设置中间下标, mid = (first+last)//2 # 如果中间的数, 等于要查找的数, 返回这个数的下标 if data[mid] == find_num: return mid # 如果中间的数, 小于要查找的数, 将中间数的下标加一, 作为下一步要查找的起始下标 if data[mid] < find_num: first = mid + 1 # 如果中间的数, 大于要查找的数, 将中间数的下标减一, 作为下一步要查找的末尾下标 if data[mid] > find_num: last = mid - 1
递归版:
def bin_search(data, find_num): first = 0 last = len(data) - 1 mid = (first + last) // 2 if data[mid] == find_num: return mid elif data[mid] < find_num: bin_search(data, mid + 1, find_num) else: bin_search(data, first, mid - 1)