1.基本原理
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
排序思想:
从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。
时间复杂度:
冒泡排序的时间复杂度在最坏和平均情况下都是 O(n^2),其中 n 是列表的长度。
解释如下:
- 最坏情况下,即输入数组完全逆序,需要进行 n(n-1)/2 次比较和交换,所以最坏情况下的时间复杂度是 O(n^2)。
- 平均情况下,需要进行近似 n(n-1)/4 次比较和交换,所以平均情况下的时间复杂度也是 O(n^2)。
在最好情况下,即输入数组已经完全有序,冒泡排序只需要进行 n-1 次比较,不需要进行交换,所以最好情况下的时间复杂度是 O(n)。
图形解释:
2. 代码如下:
#coding=utf-8
#冒泡排序
data=[2,5,8,11,6,8,6,8,9,11,555,68,56]#定义无序list
new_data=data.copy()#data列表的副本,以下我们对副本进行操作,目的是不改变原始data中的顺序,最后形成对比
n=len(new_data)#n为无序list(data)的长度,len(data)获取无序列表中元素的长度
#冒泡排序算法
for i in range(n-1): #有n个数所以需要执行n-1次
for j in range(n-1): #从第一个数到倒数第二个数,因为j+1所以阔以到最后一个数
if new_data[j]>new_data[j+1]: #判断前一个数是否大于后一个数
temp=new_data[j+1] #小数储存
new_data[j+1]=new_data[j] #大数在后
new_data[j]=temp #将小数置前
print('初始无序list(data):',data)
print('冒泡排序后有序list(new_data):',new_data)
输出结果:
注:
本文章排序思想,图形解释内容来自于 @小明的c++笔记本 大大的文章,链接如下:http://t.csdnimg.cn/ZRtx5http://t.csdnimg.cn/ZRtx5