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))