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);

 

posted @ 2018-11-11 09:08  写的BUG代码少  阅读(141)  评论(0编辑  收藏  举报