亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

冒泡排序、插入排序與選擇排序(Python)

系統 1903 0

1、冒泡排序

  • 冒泡排序只會操作相鄰的兩個數據。
  • 每次冒泡操作都會對相鄰的兩個元素進行比較,看是否滿足大小關系要求。如果不滿足就讓它倆互換。
  • 一次冒泡會讓至少一個元素移動到它應該在的位置,重復 n 次,就完成了 n 個數據的排序工作。

第一次冒泡操作的詳細過程

冒泡排序、插入排序與選擇排序(Python)_第1張圖片

經過一次冒泡操作之后,6 這個元素已經存儲在正確的位置上。要想完成所有數據的排序,我們只要進行 6 次這樣的冒泡操作就行了。

冒泡排序、插入排序與選擇排序(Python)_第2張圖片

實際上,冒泡過程還可以優化。當某次冒泡操作已經沒有數據交換時,說明已經達到完全有序,不用再繼續執行后續的冒泡操作。下圖中的另外一個例子,這里面給 6 個元素排序,只需要 4 次冒泡操作就可以了。

冒泡排序、插入排序與選擇排序(Python)_第3張圖片

優化后的冒泡排序代碼如下:

            
              """
    優化的冒泡排序:
    當某次冒泡操作已經沒有數據交換時,說明已經達到完全有序,不用再繼續執行后續的冒泡操作
"""
def bubble_sort(a):
    '''   
    :param a: List[int]
    '''
    length = len(a)
    if length <= 1:
        return 

    for i in range(length):
        made_swap = False
        # 下標j + 1 最大為 length - 1
        for j in range(length-1-i):
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j+1], a[j]
                made_swap = True
        # 優化:無數據交換,結束排序操作
        if not made_swap:
                break
    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(bubble_sort(a))
            
          

?

2、插入排序

首先,我們將數組中的數據分為兩個區間, 已排序區間 未排序區間 。初始已排序區間只有一個元素,就是數組的第一個元素。插入算法的核心思想是取未排序區間中的元素,在已排序區間中找到合適的插入位置將其插入,并保證已排序區間數據一直有序。重復這個過程,直到未排序區間中元素為空,算法結束。

如圖所示,要排序的數據是 4,5,6,1,3,2,其中左側為已排序區間,右側是未排序區間。

插入排序也包含兩種操作,一種是元素的 比較 ,一種是元素的 移動 。當我們需要將一個數據 a 插入到已排序區間時,需要拿 a 與已排序區間的元素依次比較大小 ,找到合適的插入位置。找到插入點之后,我們還需要 將插入點之后的元素順序往后移動一位 ,這樣才能騰出位置給元素 a 插入。

冒泡排序、插入排序與選擇排序(Python)_第4張圖片

代碼如下:

            
              """
    插入排序包含兩種操作,一種是元素的比較,一種是元素的移動。
    當我們需要將一個數據 a 插入到已排序區間時,需要拿 a 與已排序區間的元素依次比較大小,找到合適的插入位置。
    找到插入點之后,我們還需要將插入點之后的元素順序往后移動一位,這樣才能騰出位置給元素 a 插入。
"""
def insertion_sort(a):
    '''
    :param a: List[int]
    '''
    length = len(a)
    if length <= 1:
        return

    for i in range(1, length):
        value = a[i]
        j = i - 1
        # 查找插入位置,在前面的已排序區間,拿value與已排序區間的元素依次比較大小
        while j >= 0 and a[j] > value:
            # 數據向后移動
            a[j+1] = a[j]
            j -= 1
        # 插入數據
        a[j+1] = value

    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(insertion_sort(a))
            
          

?

3、選擇排序

選擇排序算法的實現思路有點類似插入排序,也分已排序區間和未排序區間。但是選擇排序每次會 從未排序區間中找到最小的元素,將其放到已排序區間的末尾

冒泡排序、插入排序與選擇排序(Python)_第5張圖片

選擇排序是一種不穩定的排序算法。從圖中可以看出,選擇排序每次都要找剩余未排序元素中的最小值,并和前面的元素交換位置,這樣破壞了穩定性。 ?

比如 5,8,5,2,9 這樣一組數據,使用選擇排序算法來排序的話,第一次找到最小元素 2,與第一個 5 交換位置,那第一個 5 和中間的 5 順序就變了,所以就不穩定了。

正是因此,相對于冒泡排序和插入排序,選擇排序就稍微遜色了。

代碼如下:

            
              def selection_sort(a):
    length = len(a)
    if length <= 1:
        return

    for i in range(length):
        # i是每次已排序區間的末尾
        min_index = i
        min_val = a[i]
        # 查找未排序區間中最小的元素
        for j in range(i, length):
            if a[j] < min_val:
                # 未排序區間最小的元素
                min_val = a[j]
                min_index = j
        a[i], a[min_index] = a[min_index], a[i]

    return a

if __name__ == '__main__':
    a = [7,1,4,3,6,5]
    print(selection_sort(a))
            
          

?


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 成 人 a v免费视频 | 精品国产品国语在线不卡丶 | 亚洲精品www久久久久久久软件 | 一级毛片日韩a欧美视频 | 啪啪免费网站入口链接 | 精品伦理 | 97se亚洲国产综合自在线观看 | 国产成人91 | 久热精品免费 | 男人资源网站 | 99视频在线播放 | 国产精品亚洲玖玖玖在线靠爱 | 91热在线观看精品 | 久久人人爽人人爽人人片av不 | 欧美日韩中文一区二区三区 | 日韩亚洲欧美在线爱色 | 久久成人免费观看草草影院 | 亚洲国产国产综合一区首页 | se94se在线看片secom | 久久国产香蕉 | 日韩中文字幕精品视频在线 | 色老头xxxwww作爱视频 | 亚洲视频在线观看地址 | 国产骚b | 亚洲国产高清视频在线观看 | 99国产欧美久久精品 | 久久久在线视频精品免费观看 | 又爽又黄又无遮挡的视频在线观看 | 激情国产视频 | 91色老99久久九九爱精品 | 欧美理论片大全在线观看 | 亚洲天堂h | 日本xxxx色视频在线观看免 | 久久国产国内精品对话对白 | 国产婷婷色 | 欧美成人小视频 | 四虎在线最新地址4hu | 久久久久久一级毛片免费无遮挡 | 99在线热视频只有精品免费 | 黄色影院免费观看 | 欧美激情_区二区三区 |