欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1755 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條評論
主站蜘蛛池模板: 九九精品视频一区在线 | 激情六月丁香婷婷 | 91中文字幕在线观看 | 久草不卡视频 | 色网站综合| 色综合久久精品中文字幕首页 | 五月天综合网 | 亚洲夜夜爽| 国产在线精品一区 | 久久久久成人精品免费播放动漫 | 欧美高清不卡午夜精品免费视频 | 久久国产欧美日韩精品 | 国产精品男人的天堂 | 天天夜夜人人 | 很黄很色的小视频在线网站 | 午夜在线精品偷拍 | 久久精品中文 | a级片免费观看视频 | 日韩精品在线视频 | 亚洲免费看片网站 | 波多久久夜色精品国产 | 久操成人 | 日韩大尺度电影在线观看 | 天天天天综合 | 亚洲 日本 欧美 | 色草在线 | 久草在线视频资源站 | 日韩黄色一级视频 | 一级大片久久 | 日日夜夜天天久久 | 中文字字幕在线 | 高清在线一区二区 | 免费九九视频 | 久久亚洲国产 | 欧美三极 | 91最新在线 | 福利片在线 | 九九亚洲精品 | 大开眼界电影完整在线看 | 午夜小视频免费观看 | 免费看污网站 |