需求:冒泡排序,是一种常见的算法,举例list列表的数字元素进行排序:降序or升序,函数式编程实现
# 分析:冒泡排序是两个相邻的值进行比较,比较前后位置的值的大小,进行交换位置进行排序;
# 索引[0]会跟索引[1]进行比较,如果前面的大就交换位置,交换位置之后原来[0]位置变成了位置[1];
# 那么位置[1]再跟[2]比较,如果小,不交换原位置不变,位置[2]再跟位置[3]的元素进行比较,如果大就交换位置;
# 重复上面的步骤一直升序把list中大的元素排列到后面;再进行第二轮,把第二大的值排在倒数第二的位置。
为了直观理解上面的分析思路,先看效果图:不是那种画的表格图,是排序的过程: [10, 9, 8, 7, -6, 5, 4, 3, 2, 1]
结果是不是符合解题思路,那么现在上代码:
def sorted_list(list_num, reverse="True"):
"""
reverse="True"为升序,反之降序
:param list_num: 接收列表参数
:param reverse:
:return:
"""
for i in range(1, len(list_num)): # 外层循环控制次数
for j in range(0, len(list_num) - 1): # 内循环len-1防止索引越界
if reverse == "True": # 控制升序
if list_num[j] > list_num[j + 1]: # 如果前面的值比后面的大
temp = list_num[j] # 中间变量接收,后面进行交换位置
list_num[j] = list_num[j + 1]
list_num[j + 1] = temp
# 三行交换位置代码,可以在python一行实现:list_num[j],list_num[j + 1] = list_num[j + 1],list_num[j]
else: # reverse不为True降序
if list_num[j] < list_num[j + 1]:
temp = list_num[j]
list_num[j] = list_num[j + 1]
list_num[j + 1] = temp
# 三行交换位置代码,可以在python一行实现:list_num[j],list_num[j + 1] = list_num[j + 1],list_num[j]
print("第{}次冒泡排序list结果:{}".format(i, list_num))
list_sort = [10, 9, 8, 7, -6, 5, 4, 3, 2, 1]
# 传入的list可以input提示用户输入交互,然后拆分,迭代即可
sorted_list(list_sort)
# 有个缺陷,就是遇到排序次数
上面的结果是没问题,但是仔细一看,却发现了,在执行到第四次的时候,就已经完成了排序,但是后面还在继续执行,所以上面的冒泡排序是个伪冒泡,也就是时间最坏排序,始终会执行元素个数-1次,下面来优化代码:
def bubble_sorted(list_num, reverse="True"):
"""
reverse="True"为升序,反之降序
:param list_num: 接收列表参数
:param reverse:
:return:
"""
for i in range(1, len(list_num)): # 外层循环控制当前没有出现最值的索引
isPer=False
for j in range(len(list_num)-i): # 内循环是控制前面的元素和剩余的元素进行比较
if list_num[j] > list_num[j+1]: # 如果前面的值比后面的大,
list_num[j],list_num[j+1]=list_num[j+1],list_num[j]
isPer=True
if not isPer:
return list_num
print("第{}次选择排序最后list结果:{}".format(i, list_num))
list_sort = [21, 14, 31, 10, -14, 33, 40]
# print(bubble_sorted(list_sort))