1. 冒泡排序
排序思路:比较两个相邻的下标的对应元素,如果符合条件就交换位置(最值出现在最后位)
# 降序为例
list1 = [34,45,6,74,45,5,6,7,10,67]
# 外层循环:控制的是比较的次数
for i in range(len(list1)-1):
# 内层循环:控制的是每一轮比较的次数,同时兼顾参与比较的下标
for j in range(len(list1)-1-i):
# 比较:只要符合条件的则交换位置
# 如果下标小的元素>下标大的元素,则交换位置
# 参与比较的下标,j和j+1
if list1[j]<list1[j+1]:
list1[j],list1[j+1] = list1[j+1],list1[j]
print(list1)
2. 选择排序
排序思路:固定一个下标,然后拿这个下标对应的值和后面的元素进行比较,最值出现在头角标对应的位置
# 选择排序
# 以升序为例
list1 = [34,45,6,74,45,5,6,7,10,67]
# 外层循环:控制的是比较的轮数
for i in range(len(list1)-1):
# 内层循环:控制的是每一轮比较的次数,兼顾参与比较的下标
for j in range(i+1, len(list1)):
# 比较:只要符合条件就交换位置
# 如果下标小的元素>下标大的元素,则交换位置
# 参与比较的下标,i和j
if list1[i] > list1[j]:
list1[i],list1[j] = list1[j],list1[i]
print(list1)
3. 顺序查找(不算是一种算法,作为二分法的补充)
查找思路:将待查找的元素和指定列表中的元素进行依次比对,如果相等,则获取对应的索引即可
list1 = [34,45,6,74,45,5,6,7,10,67]
key = 45
for i in range(len(list1)):
if list1[i] == key:
print(i)
break
else:
print(f'{key}在列表中不存在')
4. 二分法查找
查找思路:如果列表是升序的前提下,将待查找的元素与中间下标对应的元素比较,如果大于中下标对应的元素,则去右半部分查找
注意:前提是列表是有序(升序或者降序)的,通过折半来缩小查找范围,提高查找效率
# 二分查找
# 以升序为例
list1 = [34,45,6,74,45,5,6,7,10,67]
list1.sort()
# 带查找元素
key = 100
# 定义变量,分别表示索引的最大值和最小值
left = 0
right = len(list1)-1
# left在逐渐增大,right在逐渐减小,在改变的过程中,直到left == right还未找到指定元素,则说明该元素不存在
while left <= right:
# 计算中间下标
middle = (left + right)//2
# 比较
if key > list1[middle]:
# 重置left的值
left = middle +1
elif key < list1[middle]:
# 重置right的值
right = middle - 1
else:
print(f'待查找元素{key}在列表的索引为:{middle}')
# 如果查找到,则可以提前结束循环,注意,只能获取一个索引
break
else:
print(f'{key}在列表中不存在')