天天看點

【算法-0】排序算法-雙向冒泡排序(也稱雞尾酒排序、攪拌排序),附python代碼+注釋

概述

從名字就可以看出來,是雙向的冒泡排序。

冒泡排序,每次都是從左往右,交換相鄰的元素,進而達到循環一邊可以把最大的元素放在右邊。

而雙向冒泡排序,在完成一次從左往右的冒泡排序後,再從右往左進行冒泡,進而把小的元素放在左邊。

下面這張圖可以很好地表達:

【算法-0】排序算法-雙向冒泡排序(也稱雞尾酒排序、攪拌排序),附python代碼+注釋

相對于簡單冒泡排序,雙向冒泡排序有什麼優點

可以減少外層循環的次數

python示例代碼

看完這個代碼,相信了解會更深,代碼的注釋也能讓你更好了解

def bubble_sort(origin_items):
    """高品質冒泡排序(攪拌排序)/雙向冒泡排序"""
    comp = lambda x, y: x > y
    items = origin_items[:]
    for i in range(len(items) - 1):
        swapped = False    # 這個标志位也是可以放到簡單冒泡排序中的,當已經排序好後,減少循環次數
        for j in range(i, len(items) - 1 - i):  # 正向:把目前循環最大的放到最後
            if comp(items[j], items[j + 1]):
                items[j], items[j + 1] = items[j + 1], items[j]
                swapped = True
        if swapped:
            swapped = False
            for j in range(len(items) - 2 - i, i, -1):  # 反向:把目前循環最小的放到最前
                if comp(items[j - 1], items[j]):
                    items[j], items[j - 1] = items[j - 1], items[j]
                    swapped = True
        if not swapped:
            break
    return items


def main():
    s = [1, 10, 2, 8, 5]
    print(bubble_sort(s))


if __name__ == '__main__':
    main()