简单排序篇
列表排序的简单排序有三种,分别是冒泡排序、选择排序和插入排序。
这里我们来讨论冒泡排序:
冒泡排序
冒泡排序是一种经典又基础的排序算法,即对列表中的元素相邻两个进行比较,前面大于后面则交换位置。
对于该算法的逻辑体现可以看做是每一轮冒泡会将无序列表中一个最大元素“顶”到一个有序区域里,而一次又一次的冒泡不断地将元素“顶”到有序区域,直至所有元素均进入有序区域,(无序区域无元素)排序结束。
上图①—⑤即表示一趟冒泡将最大元素9“顶”到了有序区域(红色字)的过程
其代码表示如下:
#冒泡排序
def bubble_sort(list):
for i in range(len(list)-1): #第i趟冒泡
for j in range(len(list)-i-1):
if list[j]>list[j+1]: #相邻两元素比较,交换位置判定
list[j],list[j+1]=list[j+1],list[j] #交换两元素位置
print(list) #每趟打印一次冒泡后的列表
li=[1,9,8,6,5,7,10]
print(li)
bubble_sort(li)
运行结果:
[1, 9, 8, 6, 5, 7, 10]
[1, 8, 6, 5, 7, 9, 10]
[1, 6, 5, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
由此可见,冒泡排序可以完成对列表的排序,但通过这个运行结果我们发现,从第四趟结束这个列表就已经排好序了。但由于代码没有设置停止条件,所以仍会继续运行至第n-1趟结束。
那我们就优化一下上面的代码,让其在排好序后跳出循环,避免出现资源的浪费,代码如下:
#冒泡排序优化
def bubble_sort(list):
for i in range(len(list)-1): #第i趟冒泡
exchange=False
for j in range(len(list)-1-i):
if list[j]>list[j+1]: #相邻两元素比较,交换位置判定
list[j],list[j+1]=list[j+1],list[j] #交换两元素位置
exchange=True
print(list)
if not exchange: #每一趟冒泡都进行一次判断
return
li=[1,9,8,6,5,7,10]
print(li)
bubble_sort(li)
其结果如下:
[1, 9, 8, 6, 5, 7, 10]
[1, 8, 6, 5, 7, 9, 10]
[1, 6, 5, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
[1, 5, 6, 7, 8, 9, 10]
不难发现,相较于优化前的代码来说,运行结果减少了两次无用打印(即避免无用功的循环冒泡排序)。
顺便一提,冒泡排序的时间复杂度是O(n²)。
提示:下一篇是第二种简单排序——选择排序。