目录
1.顺序查找法
查找算法是在程序设计中最常用到的算法。假定要从n个元素中查找x的值是否存在,从头到尾逐个查找,这种方法称为顺序查找法。
顺序查找法有三种情况可能发生:在最好的情况下,第一项就是要找的数据结构,只有一次比较;在最差的情况下,需要n次比较,其全部比较完之后查不到数据;在平均情况下,比较次数为n/2次。算法的时间复杂度为O(n)。
例题:在顺序表中查找特定数值。
def sequentialSearch(alist,item):
pos=0 #初始位置
found=False #未找到数据对象
#循环条件
while pos<len(alist)and not found:
if alist[pos]==item:
found =True
else:
pos =pos+1
return found
testlist=[1,3,33,8,37,29,32,15,5]
print(sequentialSearch(testlist,3))
print(sequentialSearch(testlist,13))
例2:在列表中顺序查找最大值和最小值。
def max1(alist):
pos=0
iMax=alist[0] #假设第一个值最大
while pos<len(alist):
if alist[pos]>iMax:
iMax=alist[pos] #赋值
pos=pos+1
return iMax
def min1(alist):
iMin=alist[0]
for item in alist:
if item<iMin:
iMin=item
return iMin
testlist=[1,3,33,8,37,29,32,15,5]
print("max=",max1(testlist))
print("min=",min1(testlist))
2.二分查找法
二分查找法又称折半查找法,用于预排序列表的查找方法。
如果要在排序列表alist中查找元素t,首先将列表alist中间位置的项域查找关键字t比较,如果两者相等,则查找成功;否则利用中间项将列表分成前、后两个子表,如果中间位置项目大于t,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,即查找成功;或者直到子表不存在为止,即查找不成功。
对于包含N个元素的表,其时间复杂度为O(log2^N)。
例3:二分查找法的递归实现。
def _binarySearch(key,a,lo,hi):
if hi<=lo:return -1
mid = (lo+hi)//2
if a[mid]>key: #中间位置大于关键字
return _binarySearch(key,a,lo,mid) #递归查找中间位置的前面的子表
elif a[mid]<key:
return _binarySearch(key,a,mid+1,hi) #递归查找中间位置的后面的子表
else:
return mid #等于则返回中间位置
def binarySearch(key,a):
return _binarySearch(key,a,0,len(a))
a=[1,13,26,33,45,55,68,72,83,99]
print(binarySearch(99,a))
print(binarySearch(2,a))
例4:二分查找法的非递归实现
def binarySearch(key,a):
low = 0 #设置最小边界
high = len(a) - 1 #设置最大边界
while low <= high: #左边界小于等于右边界,则循环
mid = (low + high) // 2
if a[mid]<key: #中间位置小于查找值
low=mid+1 #调整最小边界
elif a[mid]>key: #中间位置大于查找值
high=mid-1 #调整最大边界
else:
return mid
return -1
a=[1,13,26,33,45,55,68,72,83,99]
print(binarySearch(99,a))
print(binarySearch(2,a))
3.Python提供的查找算法。
Python提供了下列的查找算法:
(1)运算符in:“x in list”测试x是否存在于list中
(2)内置函数max()、min():查找列表中的最大值和最小值。
更方便的使用查找算法。
x=list(map(int,input().split()))
print(3 in x)
print(max(x),min(x))