https://visualgo.net/zh
查找算法
顺序查找
无序表查找
# alist:无序列表 target:要找的数据项
import random
def sequentialSearch(alist, target):
# 索引位置
pos = 0
# 是否找到
found = False
# 循环条件为:索引值小于列表的长度和为 true;当found为false时,则会退出
while pos < len(alist) and not found:
# 如果找到目标值,将found设置为True,再次循环时,就会退出
if alist[pos] == target:
found = True
else:
# 索引值加1
pos += 1
return found
# 生成一个无序列表
lists = [random.randint(1, 50) for i in range(random.randint(1, 50))]
print(lists)
print(sequentialSearch(lists, 12))
print(sequentialSearch(lists, 49))
有序表查找
def orderedSequentialSearch(alist, target):
# 索引位置
index = 0
# 设置是否找到
found = False
# 当前值是否大于目标值
stop = False
# 循环条件为:索引值小于列表长度,并且 当found为 True和 stop为 True时退出循环
while index < len(alist) and not found and not stop:
if target == alist[index]:
# 当 found为True,则会退出
found = True
else:
# 判断当前输入是否大于目标值
if alist[index] > target:
# 当 stop为True,则会退出
stop = True
else:
index += 1
return found
# 定义一个有序列表
lists = [1, 9, 13, 46, 89, 126, 456, 792, 965]
print(orderedSequentialSearch(lists, 23)) # False
print(orderedSequentialSearch(lists, 126)) # True
二分查找
二分查找: 分而治之
# 二分查找: 分而治之
def binarySearch(alist, target):
# 第一个元素的位置
first = 0
# 最后一个元素的位置
last = len(alist) - 1
# 设置是否找到
found = False
# 循环条件为:first <= last 并且没有找到
while first <= last and not found:
# 取中间值
midpoint = (first + last) // 2
# 如果列表的中间值为目标值,则表示找到目标值
if alist[midpoint] == target:
found = True
else:
# 如果目标值小于列表中的中间值,则表示目标值在后半截
if target < alist[midpoint]:
# 最后一个元素位置则缩短为中间值-1的位置
last = midpoint - 1
# 否则表示目标值在前半截
else:
# 第一个元素的位置为中间值+1
first = midpoint + 1
return found
# 定义一个有序列表
lists = [1, 20, 35, 45, 58, 87, 94, 144, 214, 448]
print(binarySearch(lists, 45)) # True
print(binarySearch(lists, 23)) # False
排序算法
冒泡排序
import random
def bubbleSort(alist):
# 遍历传入的列表,遍历 n-1 趟
for passNum in range(len(alist) - 1, 0, -1):
# 在每一趟中对比前一项是否大于后一项
for i in range(passNum):
# 如果前一项大于大于后一项
if alist[i] > alist[i + 1]:
# 交换他们的位置
alist[i], alist[i + 1] = alist[i + 1], alist[i]
# 定义列表
lists = [28,20, 6, 42, 19, 49, 37]
bubbleSort(lists)
print(lists)