一、简单算法【面试题】
1.冒泡排序
排序思路:比较两个相邻的下标对应的元素,如果符合条件就交换位置
# 冒泡排序
# 1.升序排序
numlist = [24,56,78,8,7,100,45,56,7,8]
# 外层循环:控制的是比较的轮数
for i in range(len(numlist) - 1):
# print("轮数:",i)
# 内层循环:控制的是每一轮比较的次数,兼顾索引
for j in range(len(numlist) - 1 - i):
# 进行比较,如果符合条件则交换位置
# 条件:索引小的元素 > 索引大的元素
# print("比较的索引为:",j,j + 1)
if numlist[j] > numlist[j + 1]:
numlist[j],numlist[j + 1] = numlist[j + 1],numlist[j]
print(numlist)
print("*" * 50)
# 2.降序排序
numlist = [24,56,78,8,7,100,45,56,7,8]
# 外层循环:控制的是比较的轮数
for i in range(len(numlist) - 1):
# 内层循环:控制的是每一轮比较的次数,兼顾索引
for j in range(len(numlist) - 1 - i):
# 进行比较,如果符合条件则交换位置
# 条件:索引小的元素 > 索引大的元素
if numlist[j] < numlist[j + 1]:
numlist[j],numlist[j + 1] = numlist[j + 1],numlist[j]
print(numlist)
# 3
numlist = [24,56,78,8,7,100,45,56,7,8]
numlist.sort() # 升序
print(numlist)
numlist = [24,56,78,8,7,100,45,56,7,8]
numlist.sort(reverse=True) # 降序
print(numlist)
# 自学:插入排序,快速排序
2.选择排序
排序思路:固定一个下标,然后拿这个下标对应的元素依次和后面的元素进行比较,如果符合条件就交换位置
# 选择排序
# 1.升序排序
numlist = [24,56,78,8,7,45,67,67,8,100,88]
# 外层循环:控制的是比较的轮数
for i in range(len(numlist) - 1):
# print("轮数:",i)
# 内层循环:控制的是每一轮比较的次数,兼顾索引
for j in range(i + 1,len(numlist)):
# 进行比较,如果符合条件则交换位置
# 条件:索引小的元素 > 索引大的元素
# print("比较的索引为:",i,j)
if numlist[i] > numlist[j]:
numlist[i],numlist[j] = numlist[j],numlist[i]
print(numlist)
print("*" * 50)
# 2.降序排序
numlist = [24,56,78,8,7,45,67,67,8,100,88]
# 外层循环:控制的是比较的轮数
for i in range(len(numlist) - 1):
# 内层循环:控制的是每一轮比较的次数,兼顾索引
for j in range(i + 1,len(numlist)):
# 进行比较,如果符合条件则交换位置
# 条件:索引小的元素 > 索引大的元素
if numlist[i] < numlist[j]:
numlist[i],numlist[j] = numlist[j],numlist[i]
print(numlist)
3.顺序查找
查找思路:将待查找元素和列表中的元素进行依次比较,如果相等,则表示查找成功
# 顺序查找
numlist = [24,56,78,8,7,45,67,67,8,100,88]
ele = 66
# 1.index()
# index1 = numlist.index(ele)
# print(index1)
# 2.
for index2 in range(len(numlist)):
if numlist[index2] == ele:
print("索引:",index2)
# 3.模拟index()
for index2 in range(len(numlist)):
if numlist[index2] == ele:
print("索引:",index2)
break
else:
print("待查找元素不存在")
4.二分法查找
查找思路:升序的前提下,将待查找的元素与中间下标对应的元素比较,如果大于中间下标对应的元素,则去右半部分查找
注意:前提是列表是有序(升序或者降序)的,通过折半来缩小查找范围,提高查找效率
# 二分法查找
# 1.列表是升序
numlist = [24,56,78,8,7,45,67,67,8,100,88]
print(numlist)
numlist.sort()
print(numlist)
ele = 78
left = 0
right = len(numlist) - 1
while left <= right:
# 计算中间下标
middle = (left + right) // 2
# 比较中间下标对应的元素和待查找元素的大小
if ele > numlist[middle] :
# 右半部分,给left重新赋值
left = middle + 1
elif ele < numlist[middle]:
# 左半部分,给right重新赋值
right = middle - 1
else:
# 相等
print(middle)
# 只要找到结果,则可以提前结束循环
break
else:
print("待查找元素不存在")
print("*" * 50)
# 2.列表是降序
numlist = [24,56,78,8,7,45,67,67,8,100,88]
numlist.sort(reverse=True)
ele = 78
left = 0
right = len(numlist) - 1
while left <= right:
# 计算中间下标
middle = (left + right) // 2
# 比较中间下标对应的元素和待查找元素的大小
if ele > numlist[middle] :
# 左半部分,给right重新赋值
right = middle - 1
elif ele < numlist[middle]:
# 右半部分,给left重新赋值
left = middle + 1
else:
# 相等
print(middle)
# 只要找到结果,则可以提前结束循环
break
else:
print("待查找元素不存在")