python 数据结构与算法 day04 冒泡排序
1. 冒泡排序
思路:
可以看做按对高低不一的一组学生按照大小个排队,校长从每次从头开始走,观察当前站的位置与后一个位置元素大小进行比较,如果比当前元素大,就交换两者的位置,然后往后走一步,接着比较当前元素与后一个位置元素大小,重复刚才的过程,,,校长一次从头走到尾的遍历过程最大位置的元素跟着走到了最后,第二次遍历,队列中第二大的元素走到了倒数第二个位置,,,以此类推;
2. 代码实现(python)
def bubble_sort(L): """冒泡排序""" n=len(L) for i in range(n-1): # 校长从头走到尾的过程持续进行了n-1次 for j in range(n-1-i): # 校长在一次遍历中需要从头走到尾,比较当前位置元素与下一个元素的大小,最终把最大的元素安排到最后一个位置 if L[j]>L[j+1]: L[j],L[j+1]=L[j+1],L[j] return L print(bubble_sort([2,6,1,3,8,4,7,0,9]))
运行结果:
3. 时间复杂度
冒泡排序的时间复杂度是O(n^2)----因为包含两个for 循环;
4. 稳定性
稳定性: 冒泡排序是稳定的,被排序的数组中出现两个相同的元素时,冒泡排序会维持两者原来的相对顺序,所以是稳定的
5. 优化
我们发现当数组原本就是有序序列,使用刚才的实现复杂度仍然是O(n^2) ,其实我们可以对它进行改进,就是当校长从头走到尾,发现并没有发生元素的交换过程,就代表序列已经是有序的,就不需要再重复进行从头走到尾的遍历工作了;
def bubble_sort(L): """冒泡排序""" n=len(L) for i in range(n-1): # 校长从头走到尾的过程持续进行了n-1次 count=0 for j in range(n-1-i): # 校长在一次遍历中需要从头走到尾,比较当前位置元素与下一个元素的大小,最终把最大的元素安排到最后一个位置 if L[j]>L[j+1]: L[j],L[j+1]=L[j+1],L[j] count+=1 if count==0: # 如果从头走到尾的某次过程未发生元素的交换,那么被排序的序列已经是有序的~ 直接跳出循环即可 break return L print(bubble_sort([2,6,1,3,8,4,7,0,9]))
这样对有序序列的时间复杂度就变为O(n);
talk is cheap,show me the code