欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python 之查找(线性查找和二分查找)

程序员文章站 2024-03-19 15:02:10
...

查找

一、线性查找

线性查找法:对于大型列表而言,效率低下。

例:输入一个数字,在一个数字列表中查找,并判断列表中是否存在。如果没有打印提示信息,如果存在打印下标。

代码:

list1 = [55,66,22,11,88,77,99,33,44]
num = eval(input("请输入要查找的数字:"))
list1_index = -1              #用来记录查找到的数字下标(用一个不可能的数字为初值,判断时好判断)
#使用循环线性查找
for i in range(len(list1)):
    if num == list1[i]:
        list1_index = i
        break
if list1_index == -1:
    print("列表中没有您要查找的数字!")
else:
    print("{}的下标为:{}。".format(num,list1_index))


#输入输出样例:
#样例1:
#请输入要查找的数字:22
#22的下标为:2。

#样例2:
#请输入要查找的数字:48
#列表中没有您要查找的数字!

二、二分查找

二分查找法:使用前,将列表升序排列。(如果降序排列,则和下面的规律相反。)

基本原理(规律):
首先将要查找的元素(key)与列表的中间元素比较
1、如果key小于中间元素,只需要在列表的前一半元素中继续查找key。
2、如果key和中间元素相等,匹配成功。查找结束。
3、如果key大于中间元素,只需要在列表的后一半元素中继续查找key。

实例:随机生成一个有20个元素的列表,输入一个数字查找输入数字的下标。如果没有打印提示信息,如果存在打印下标。

代码:

#二分查找法
import random
list1 = []
#使用循环生成一个元素不重复的列表
for i in range(20):
    #rand_num = random.randint(1,101)            #1~100之间
    #list1.append(rand_num)                      #生成的随机列表中可能有重复元素
    rand_num = random.randint(1,101)
    while rand_num in list1:                     #如果随机数以及在列表中,就重新生成一个
        rand_num = random.randint(1,101)
    list1.append(rand_num)

#升序排列
list1.sort()
print(list1)

#查找
num = int(input("请输入要查找的数字:"))
num_index = -1
low = 0                     #最小值(最下边界)的下标
high = len(list1) - 1       #最大值(最大边界)的下标
while high >= low:
    mid = (low+high) // 2
    #1、如果key小于中间元素,只需要在列表的前一半元素中继续查找key。
    #2、如果key和中间元素相等,匹配成功。查找结束。
    #3、如果key大于中间元素,只需要在列表的后一半元素中继续查找key。
    if num<list1[mid]:
        high = mid-1
    elif num == list1[mid]:
        num_index = mid
        break
    else:
        low = mid + 1
if num_index != -1:
    print("要查找的{}元素下标为:{}".format(num,num_index))
else:
    print("列表中没有您要查找的元素!")
 

#输入输出样例:
#样例1:
#[1, 2, 5, 7, 12, 16, 29, 50, 51, 52, 67, 70, 77, 78, 82, 83, 85, 87, 95, 100]
#请输入要查找的数字:29
#要查找的29元素下标为:6

#样例2:
#[6, 12, 21, 27, 28, 32, 43, 46, 50, 51, 52, 54, 58, 65, 73, 75, 78, 91, 93, 97]
#请输入要查找的数字:55
#列表中没有您要查找的元素!