一、顺序查找

顺序查找也称为线性查找,是所有查找算法中最简单的,一般用于线性表的查找。

简而言之,就是从下标为0的元素开始进行逐一查找,直到列表中最后一个元素。

顺序查找的优缺点:

  • 优点:对于列表没有排序的要求
  • 缺点:查找效率低

代码实现:

# 普通实现
num = eval(input('请输入一个数组:'))
sort_num = sorted(num)
user_num = int(input('请输入此次查找数字:'))
print(f'从小到大排序为:{sort_num}')

for index,i in enumerate(sort_num):
    if i == user_num:
        print(f'找到啦!!!   下标为:{index}')
else:
    print('很遗憾,没找到!!!')

上段代码第一行中的eval()是python的内置函数,当需要输入列表的时候使用

# 用函数实现
def seqSearch(alist, n):  # alist用来接收列表,n用来接收要查找的数字

    for index, i in enumerate(alist):
        if i == n:
            return index
    else:
        return None

num = eval(input('请输入一个数组:'))
sort_num = sorted(num)
user_num = int(input('请输入此次查找数字:'))
print(f'从小到大排序为:{sort_num}')

if seqSearch(sort_num, user_num):
    print(f'找到啦!!!   下标为:{seqSearch(sort_num, user_num)}')
else:
    print('很遗憾,没找到!!!')

两段代码中的enumerate()为python的内置函数,是枚举函数,输出结果中包含两部分:

  1. 第一部分------》元素的下标(索引)值
  2. 第二部分------》相对应的元素值

二、二分查找

二分查找也称为折半查找,相比较顺序查找,减少了查找次数、提高了查找效率。

二分查找的算法思想:

将列表中n个元素大致分成2个相等的部分,在python中,取得是 a[n//2] 与 要查找的数字(这里设为x)比较,如果相等,算法终止;如果不相等继续比较,当 a[n//2]大于x,则取前n//2个数据,当 a[n//2]小于x,则取后n//2个数据。以此类推,直至找到x。

总共有n个元素,渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。

注意:二分查找要求待查列表为有序的(从小到大排序,或者从大到小排序)

二分查找优缺点:

  • 优点
  • 比较次数减少
  • 查找效率高
  • 缺点
  • 列表插入删除困难

代码实现:

# 普通算法
def binary_search(data, alist):
    n = len(alist)
    start = 0
    end = n-1
    while start <= end:
        mid = (start + end) // 2
        if alist[mid] < data:
            start = mid + 1
        elif alist[mid] > data:
            end = mid - 1
        else:
            return True
    return False

num = eval(input('请输入一个数组:'))
sort_num = sorted(num)
user_num = int(input('请输入此次查找数字:'))
print(f'从小到大排序为:{sort_num}')
if binary_search(user_num, sort_num):
    print('找到啦!!!')
else:
    print('很遗憾,没找到!!!')

用递归实现:

 

def binary_search(data, alist):
    n = len(alist)
    while n > 0:
        mid = n // 2
        if alist[mid] < data:
            return binary_search(data, alist[mid+1:])
        elif alist[mid] > data:
            return binary_search(data, alist[:mid])
        else:
            return True, mid
    return False

num = eval(input('请输入一个数组:'))
sort_num = sorted(num)
user_num = int(input('请输入此次查找数字:'))
print(f'从小到大排序为:{sort_num}')
if binary_search(user_num, sort_num):
    print('找到啦!!!')
else:
    print('很遗憾,没找到!!!')

写的不好的地方请见谅!!!并且希望您指出不好的地方,我改正。