一、顺序查找算法
顺序查找又称为线性查找,是最简单的查找算法。这种算法就是按照数据的顺序一项一项逐个查找,所以不管数据顺序如何,都得从头到尾地遍历一次。顺序查找的优点就是数据在查找前,不需要对其进行任何处理(包括排序)。缺点是查找速度慢,如果数据列的第一个数据就是想要查找的数据,则该算法查找速度为最快,只需查找一次即可;如果查找的数据是数据列的最后一个(第几个),则该算法查找速度为最慢,需要查找 n 次,甚至还会出现未找到数据的情况。
例如,有这样一组数据:10、27、13、14、19、85、70、29、69、27。如果想要查找数据 19,需要进行 5 次查找;如果想要查找数据 27,需要进行 10 次查找;如果想要查找数据 10,只需要进行 1 次查找。
从这个例子中可以看出,当查找的数据较多时,用顺序查找就不太合适,所以说顺序查找只能应用于查找数据较少的数据列。这个过程好比我们在抽屉里找笔,如下图所示。通常情况下我们会从上层的抽屉开始,一层一层地查找,直到找到笔为止,这个例子就是生活中典型的顺序查找算法。
例如,随机从 1~100 之间生成 50 个整数,并将随机生成的这 50 个数显示出来,然后用顺序查找算法查找16、45、97这几个数据的位置。具体代码如下:
import random # 导入随机数模块 num = 0 # 定义变量num # 使用列表推导式生成包含50个元素的列表 data = [random.randint(1, 100) for i in range(50)] print("随机产生的数据内容是:") for i in range(10): # 遍历行 for j in range(5): # 遍历列 # 按格式输出随机生成内容 print('%2d[%3d] ' % (i * 5 + j + 1, data[i * 5 + j]), end='') print('') while num != -1: # 循环输入 find = 0 # 比较次数 num = int(input("请输入想要查找的数据,输入-1退出程序:")) # 数据输入 for i in range(50): # 循环遍历50个随机数 if data[i] == num: # 判断输入数据和data数据是否相等 print("在", i + 1, "个位置找到数据", data[i]) # 输出找到的位置和数据内容 find += 1 # 比较次数加1 if find == 0 and num != -1: # 判断比较次数是否为0且输入数据是否为-1 print("没有找到", num, "此数据") # 提示没有找到数据
程序运行结果如下图所示:
二、折半查找算法
折半查找算法又称为二分查找算法,折半查找算法是将数据分割成两等份,首先用键值(要查找的数据)与中间值进行比较。如果本文来源gao@!dai!ma.com搞$$代^@码5网@键值小于中间值,可确定要查找的键值在前半段;如果键值大于中间值,可确定要查找的键值在后半段。然后对前半段(后半段)进行分割,将其分成两等份,再对比键值。如此循环比较、分割,直到找到数据或者确定数据不存在为止。折半查找的缺点是只适用于已经初步排序好的数列;优点是查找速度快。