查找算法

查找算法

顺序查找(线性查找)

  1. 思想:根据列表下标的顺序,一步步查找列表中的元素是否有与需查找元素相对应,有则返回下标。
  2. 代码实现
# 顺序查找
def linear_search(li,e):
    for ind,val in enumerate(li):
        if val == e:
            return ind
    else:
        return None
li = list(range(10))
import random
random.shuffle(li)
print(li)
print(linear_search(li,8))
  1. 时间复杂度:O(n)(对列表元素进行一次遍历)

二分查找

  1. 思想:前提为有序列表,对列表进行平均分割,当待找元素大于分割界为下标的元素时,往分割线的后半部分进行查找,否则往分割线前半部分查找
  2. 代码实现
# 折半查找
def binary_search(li,value):
    left=0                      # 设置左边下标
    right=len(li)-1             # 设置右边下标
    while left<=right:          # 当剩余元素不为0时
        mid=(left+right)//2     # 设置中间下标(以中间下标的值作为分裂口)
        if li[mid]>value:
            right=mid-1
        elif li[mid]<value:
            left=mid+1
        else:
            return mid
    else:
        return None
li = list(range(50))
print(li)
print(binary_search(li,20))
  1. 例题
# 题目:给定一个m*n的二维列表,查找一个数是否存在
li=[[1,3,5,7],[10,11,16,20],[23,30,34,50]]   # 已知该列表是有序列表,可用二分查找
ltmp=[]
for i in li:
    ltmp.extend(i)
print(ltmp)
def binary_sort(li,value):
    left = 0
    right = len(li)-1
    while left<=right:   # 当元素个数不为0时
        mid = (left+right)//2
        if li[mid]==value:
            return mid
        elif li[mid]>value:
            right = mid-1
        else:
            left = mid+1
    else:
        return False
print(binary_sort(ltmp,9))
  1. 时间复杂度:O(nlogn)(存在折半查找)
posted @ 2023-10-20 15:23  byyya  阅读(31)  评论(0)    收藏  举报