基本概念
- 查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的全过程.
- 列表查找:又叫线性查找:从列表中查找指定元素。
- 输入:列表、待查找元素。
- 输出:元素下标(为找到元素时一般返回None或),或者是返回查找的元素等等。
- 内置列表查找函数:index() [这是线性查找]
顺序查找(Linear Search)
- 顺序查找:也叫线性查找,从列表第一个元素开始,顺序进行搜索,直到找到元素或搜索到列表最后一个元素为止.(顺序查找相当于for循环查找)
- 顺序查找的时间复杂度是O(n)
顺序查找代码如下:
"""
作者:佩大奇
日期:2022/03/05/
描述:这是顺序查找,相当于for循环查找
"""
def linear(li,val):
for index ,value in enumerate(li):
#!这里的enumerate是python的内置函数,在字典上是枚举、列举的意思,相当于一个黑箱子,装下列表等等,
#!用户可以通过for循环定义变量属于这个盒子,通过遍历盒子查找值
if val==value:
return index
return -1
print("请输入列表中的元素,用空格隔开,回车结束:")
li=list(input().split())#键盘输入列表元素,回车结束
for i in range(len(li)):#列表元素转换成int类型
li[i]=int(li[i])
print("列表li为:")
print(li)
print(linear(li,5))#调用函数查找元素
二分查找(Binary Search)
- 二分查找:也叫折半查找,从有序列表的初始候选去 li [0:n]开始,通过对待查找的值于候选区中间值的比较,可以使候选去减少一半。
- 二分查找的时间复杂度是O(logn)
- 注意:二分查找的前提是列表是有序列表,否则在查找时会查找失败!
二分查找代码如下:
"""
作者:佩大奇
日期:2022/03/05/
描述:这是二分查找,二分查找的要求是列表必须为有序列表,设置left和right,其中left和right是列表的下标,每一次查找都是折半查找,
mid=(left+right)/2,要查找的值value大于li[mid]时,说明mid左边是候选区,所以right=mid-1,当value小于li[mid]时,
说明右边时候选区,所以left=mid+1,当left大于right时,说明查找失败,列表中不存在查找元素。
"""
def binary(li,value):
left=-1;
right=len(li)
while left<=right:
mid=(left+right)/2
#或者时 mid=(left+right)//2,这也是取整的办法
mid=int(mid)
if li[mid]==value:
print("查找成功,要查找元素的下标为:")
print(mid)#因为mid时下标,所以只能时整数,这里用向上取整的方法,e.g:1.5转换为整数就是1,如果时向下取整,那么1.5转换为整数就是2
print("要查找的元素为:")
print(li[mid])
break
if li[mid]>value:
right=mid-1
continue
if li[mid]<value:
left=mid+1
continue
else:
print("查找失败!列表中不存在要查找的元素")
print("请输入列表中的元素,用空格隔开:")
li=list(input().split())
for i in range(len(li)):
li[i]=int(li[i])
print("请输入你要查找的元素:")
val=int(input())
print("列表li为:")
print(li)
print("你要查找的元素为:")
print(val)
print("--------------查找结果----------")
binary(li,val)