冒泡排序

冒泡排序

描述:

1. 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
2. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。

原理:

1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3. 针对所有的元素重复以上的步骤,除了最后一个。

4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

标准版:

def bubble_sort(li):
    n = len(li)
    for i in range(n - 1):
        judge = True
        for j in range(0, n - 1 - i):
            if li[j] > li[j + 1]:
                li[j], li[j + 1] = li[j + 1], li[j]
                judge = False
        if judge:
            break
    return li

注释版:

def bubble_sort(li):
    n = len(li)
    # n为列表的长度
    for i in range(n - 1):
        # 外层循环控制内层循环执行的次数, i为第几趟
        # for i in range(n - 1): 等价于 for i in range(len(li) - 1)
        # 后者属于未优化状态, 因为每执行一次循环都需要计算一下列表的长度
        judge = True
        for j in range(0, n - 1 - i):
            # 内层循环执行一次, 选出当前数组中最大的一个值
            # n - 1 - j 注: 执行一次循环后, 选出最大的值, 下次比较就不用再比较它了
            if li[j] > li[j + 1]:
                # 如果前者大于后者, 交换位置
                li[j], li[j + 1] = li[j + 1], li[j]
                judge = False
        if judge:
            break
        # 布尔值的优化, 如果序列已经排好序, 不会进入if判断语句,  直接跳出循环结束函数
    return li
    # 将冒号后的列表, 返回

if __name__ == "__main__":
    l = list(i for i in range(0, 10000))
    print("洗牌之前的列表:" + str(l))
    random.shuffle(l)
    # shuffle()函数是random模块内的一个洗牌函数, 顾名思义: 将有序的列表的顺序打乱
    print("洗牌之后的列表:" + str(l))
    print("冒泡之后的列表:" + str(bubble_sort(l)))

时间复杂度:

最好情况O(n):

文件的初始状态是正序的,一趟扫描即可完成排序。
所需的关键字比较次数和记录交换次数均达到最小值
所以,冒泡排序最好的[时间复杂度]为O(n)

最坏情况O(n^2):

若初始文件是反序的,需要进行n趟排序。
每趟排序要进行n-1次关键字的比较,且每次比较都需要交换记录位置。
在这种情况下,比较和交换次数均达到最大值:
冒泡排序的最坏时间复杂度为O(n^2) n^2的意思是n的2次方

平均时间复杂度O(n^2):

平均时间复杂度一般都为最坏时间复杂度.
因为算法也是为了解决问题而产生的, 要完美的解决问题, 必须考虑到最坏情况, 并给出解决方案

稳定性:

冒泡算法的原理就是从左向右相邻的元素两两对比,如果前者大于后者,则进行交换。如果两个元素相等,是不会交换其位置的,因此冒泡排序是稳定的。

注:如果将交换条件改为“list[i]>=list[i+1]”就不是稳定的了。

原文地址:https://www.cnblogs.com/amou/p/8991629.html