#二分查找 需要列表为有序 时间复杂度O(logn)
import random
def binarySearch(listn,value):
listn.sort()
mid = len(listn) // 2
left=0
right=len(listn)-1
count=0
while(listn[left]<listn[mid]):
count += 1
if value<listn[mid]:
right=mid
mid=(right+left)//2
elif value>listn[mid]:
left=mid
mid=(right+left)//2
if (value == listn[mid]):
print('count:', count)
# 在得到结果时循环检测和前一个元素是否相等
while listn[mid - 1] == listn[mid]:
mid -= 1
return mid
return -1
listn=[]
for _ in range(100):
rd=random.randrange(10)
# 如果列表里有相同的查询数字就会出现问题:可能会得到后面数字的索引
# 解决方案: 在得到结果时循环检测和前一个元素是否相等
# if(rd!=7):
# listn.append(rd)
listn.append(rd)
#listn.append(7)
print(binarySearch(listn.copy(),7))
#系统自带方法find() 检测结果是否正确
listm=listn.copy()
listm.sort()
print('find : ',''.join([str(m) for m in listm]).find('7'))
#插值查找 需要列表为有序 时间复杂度O(logn)
import random
def InsertionSearch(listn,value):
listn.sort()
count=0
left=0
right=len(listn)-1
#mid=low+(high-low)*(key-a[low])/(a[high]-a[low])
#mid=left +int((right - left) * (value - listn[left]) /(listn[right] - listn[left]))
while(listn[left]<listn[right]):
mid = left + int((right - left) * (value - listn[left]) / (listn[right] - listn[left]))
count += 1
if value<listn[mid]:
right=mid-1
elif value>listn[mid]:
left=mid+1
if(value==listn[mid]):
print('count:',count)
#在得到结果时循环检测和前一个元素是否相等
while listn[mid-1]==listn[mid]:
mid-=1
return mid
return -1
listn=[]
for _ in range(100):
rd=random.randrange(10)
# if(rd!=7):
# listn.append(rd)
listn.append(rd)
print(InsertionSearch(listn.copy(),7))
#系统自带方法find() 检测结果是否正确
listm=listn.copy()
listm.sort()
print('find : ',''.join([str(m) for m in listm]).find('7'))
#结论: 和二分查找一样无法找到重复元素的第一位(插值查找是在二分查找算法基础上进行优化)
#解决方案: 在得到结果时循环检测和前一个元素是否相等
#顺序查找 返回index 如果无返回-1 时间复杂度O(n)
def sequentialSearch(listn,value):
for i in range(len(listn)):
if listn[i]==value:
return i
return -1
print(sequentialSearch([4,3,9,6,7,2],7))