线性查找和二分查找

import random

# 线性查找
number_list = [0,1,2,3,4,5,6,7,8,9]


def linear_search(val, iterable):
    for index, value in enumerate(iterable):
        if value == val:
            return index
    return -1
print(linear_search(5, number_list))


def linear_search_v2(iterable, predicate=lambda x: x == 4):
    random.shuffle(iterable)
    print(iterable)
    for index, value in enumerate(iterable):
        if predicate(value):
            return index
    return -1
print(linear_search_v2(number_list))


def linear_search_recusive(array, value):
    if len(array) == 0:
        return -1
    index = len(array) - 1
    if array[index] == value:
        return index
    return linear_search_recusive(array[0:index], value)
print(linear_search_recusive(number_list, 6))

# 二分查找
'''题目: 给定一个有序(非降序)数组A,可含有重复元素,求最小的i使得A[i]等于target,不存在则返回-1'''
def binary_search(array, value):
    start = 0
    len_arr = len(array)-1
    while start < len_arr:
        mid = (start+len_arr) // 2
        if array[mid] == value:
            if array[mid-1] == value:
                len_arr = mid -1
                continue
            return mid
        elif array[mid] > value:  # 在前半段
            len_arr = mid -1
        else:
            start = mid +1
    return -1
print('二分查找最小', binary_search([2,3,4,4,4,4,4,5,6,7,8],4))


'''给定一个有序(非降序)数组A,可含有重复元素,求最大的i使得A[i]等于target,不存在则返回-1'''
def binary_search_2(array, value):
    start = 0
    len_arr = len(array)-1
    while start < len_arr:
        mid = (start+len_arr) // 2
        if array[mid] == value:
            if array[mid+1] == value:
                start = mid +1
                continue
            return mid
        elif array[mid] > value:  # 在前半段
            len_arr = mid -1
        else:
            start = mid +1
    return -1
print('二分查找最小', binary_search_2([2,3,4,4,4,4,4,5,6,7,8],4))


'''题目: 给定一个有序(非降序)数组A,可含有重复元素,小于target的最大元素的位置,不存在则返回-1'''
def binary_search_3(array, value):
    start = 0
    len_arr = len(array)-1
    while start < len_arr:
        mid = (start+len_arr) // 2
        if array[mid] == value:
            if array[mid-1] == value:
                len_arr = mid -1
                continue
            return mid-1
        elif array[mid] > value:  # 在前半段
            len_arr = mid -1
        else:
            start = mid +1
    return -1
print('二分查找最小', binary_search_3([2,3,4,4,4,4,4,5,6,7,8],4))

 

posted @ 2020-05-05 02:43  SBJBA  阅读(123)  评论(0)    收藏  举报