二、搜索

1. 搜索

(1)顺序搜索

def search(num_list, val):
    if num_list == None:
        return -1
    
    for i in range(0, len(num_list)):
        if (num_list[i] == val):
            return i
    return -1

分析:时间复杂度为O(n),空间复杂度O(1) 

(2) 二分搜索

A. 递归版本

def bi_search_re(num_list, val):
    def bi_search(l, h):
        
        if l > h:
            return -1
        
        mid = (l + h) // 2
        if (num_list[mid] == val): # 递归的base情况 
            return mid;
        elif (num_list[mid] < val): # 往右查找
            return bi_search(mid + 1, h)
        else: 
            return bi_search(l, mid - 1) # 往左查找
        
    return bi_search(0, len(num_list)-1)

B. 迭代版本

def bi_search_iter(alist, item):
    left, right = 0, len(alist) - 1
    while left <= right:
        mid = (left + right) // 2
        if alist[mid] < item: # 向右查找
            left = mid + 1
        elif alist[mid] > item: # 向左查找 
            right = mid - 1
        else: # alist[mid] = item 
            return mid
    return -1

分析:时间复杂度O(lgN),空间复杂度O(1),什么情况下适合此种方法?———>  数组前提是排好序的

原文地址:https://www.cnblogs.com/carlber/p/14169915.html