python实现各种查找算法

#二分查找 需要列表为有序 时间复杂度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))

猜你喜欢

转载自blog.csdn.net/w6790400/article/details/84971837