一、顺序查找
def linear_search(data, key):
lens = len(data)
for i in range(lens):
if data[i] == key:
return i
return -1
if __name__ == '__main__':
values = [10, 34, 56, 9, 12, 3, 76, 45, 99, 84, 25, 67]
result = linear_search(values, 50)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
result = linear_search(values, 25)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
顺序查找:从待查找数据的第一个元素开始,逐个将每个元素与要查找的数据值进行对比:如果比较到两者值相同,则查找成功;如果一直到最后都未找到,则查找失败。特点: 不要求数据本身有序劣势: 当数据集合较大时,查找效率低
二、二分查找(折半查找)
def binary_search_recur(data, key, left_index, right_index):
if right_index < left_index:
return -1
middle = (left_index + right_index) // 2
if data[middle] == key:
return middle
elif data[middle] > key:
return binary_search_recur(data, key, left_index, middle-1)
else:
return binary_search_recur(data, key, middle+1, right_index)
def binary_search_loop(data, key):
left_index = 0
right_index = len(data) - 1
while left_index <= right_index:
middle = (left_index + right_index) // 2
if data[middle] == key:
return middle
elif data[middle] > key:
right_index = middle - 1
else:
left_index = middle + 1
return -1
if __name__ == '__main__':
values = [10, 34, 56, 9, 12, 3, 76, 45, 99, 84, 25, 67]
values.sort()
print("二分查找 - 递归方式:")
result = binary_search_recur(values, 50, 0, len(values)-1)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
result = binary_search_recur(values, 25, 0, len(values) - 1)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
print("二分查找 - 循环方式:")
result = binary_search_loop(values, 50)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
result = binary_search_loop(values, 25)
if result == -1:
print('未找到该数据')
else:
print('该数据对于的下标为:{}'.format(result))
二分查找(折半查找):找出有序数据中的中间元素,有中间元素值将原数据分为两个子表,然后根据指定查找值与中间元素的大小关系进行比对:若相对,则查找成功;若查找值小于中间元素,则在左侧子表中继续查找;若查找值大于中间元素,则在右侧子表中继续查找。如此递归查找下去,直到查找成功或查找完整个数据集合为止。优势: 每次查找之后,搜索范围减半特点: 要求数据本身有序
转载请注明原文地址:https://ipadbbs.8miu.com/read-27229.html