排序算法-----冒泡排序
什么是冒泡排序呢?
它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成
上面的呢是百度词条上的定义,但理解起来是什么样子呢?
如何理解冒泡排序?
比如我们要将9,11,6,7,1,这个数列进行从小到大的排序,怎么做才能让这个数列中大的数字一点一点“冒”到最上面呢?
[ 9 , 11 , 6 , 7 , 1 ]
这是我们的初始数列,冒泡排序其实就是一个相邻的两两比较交换的排序过程,下面我们开始对他们进行排序
冒泡排序过程
[9, 11, 6, 7, 1]
第一步我们先比较9和11,如果前面的数大于后面的数对他们两个进行交换,如果没有我们就可以什么都不做让11去和它的前一位6去比
[9, 11, 6, 7, 1]
第二步我们比较发现11是两个数中比较大的数字那么我们交换他们
[9, 6, 11, 7, 1]
第三步继续比较11和他前面的数字我们继续交换 将两两比较中的较大数字一点点“冒”到最上面
[9, 6, 7, 11, 1]
[9, 6, 7, 1, 11]
当第一次循环结束我们已经找出了整个数列中最大的数字并将它排到了数列中最后面的位置那么我们在之后的排序中可以将它放在我们的数列之外
[6, 9, 7, 1, ][11]
我们继续去比较接下来的数列
试一试你理解了没有,试着说一下面交换的过程
[6, 7, 9, 1, ][11]
[6, 7, 1, 9, ][11]
[6, 7, 1,][ 9, ][11]
[6, 1, 7,][ 9,] [11]
[1, 6][, 7, ][9,][ 11]
**
冒泡排序的python实现
**
#冒泡排序------
'''
每次选取两个临近元素选取其中较大值交换到后面
时间复杂度为nlog(n)两层For循环为n**2一层for循环为n
'''
list1=[9,11,6,7,1]
for i in range(len(list1)-1):#循环指向列表中每个数
for j in range(len(list1)-i-1):#从第一个数开始将最大的数通过两两相比的形式放到最后面
if list1[j]>list1[j+1]:
list1[j],list1[j + 1]=list1[j+1],list1[j]#将当前指向的数和后一个数相比较较大的后移一位
print(list1)#输出排序过程
试着写一写上述代码的反向遍历实现
#冒泡排序反------
'''
每次选取两个临近元素选取其中较小值交换到前面
时间复杂度为nlog(n)两层For循环为n**2一层for循环为n
'''
list1=[1,9,2,8,55,63,4,71,2]
for i in range(len(list1)-1,0,-1):#循环指向列表中每个数
for j in range(len(list1)-1,len(list1)-1-i,-1):#从第最后一个数开始将最小的数通过两两相比的形式放到最前面
if list1[j]<list1[j-1]:
list1[j],list1[j - 1]=list1[j-1],list1[j]#将当前指向的数和后一个数相比较较小的前移一位
print(list1)#输出排序过程