十大經典排序算法
阿新 • • 發佈:2019-02-18
順序 yield 相等 tex 最簡 內存地址 直觀 內部 解釋
十大經典排序算法
主題:
排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。用一張圖概括:關於時間復雜度:
平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。
線性對數階 (O(nlog2n)) 排序 快速排序、堆排序和歸並排序。
O(n1+§)) 排序,§ 是介於 0 和 1 之間的常數。 希爾排序。
線性階 (O(n)) 排序 基數排序,此外還有桶、箱排序。
關於穩定性:
穩定的排序算法:冒泡排序、插入排序、歸並排序和基數排序。
不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序。
名詞解釋:
n:數據規模
k:“桶”的個數
In-place:占用常數內存,不占用額外內存
Out-place:占用額外內存
穩定性:排序後 2 個相等鍵值的順序和排序之前它們的順序相同
第一種:冒泡排序
冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。 作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書裏出現的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升性能來說並沒有什麽太大作用。
算法步驟
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
針對所有的元素重復以上的步驟,除了最後一個。
持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
動圖演示
得到結果:
添加前字典{‘a‘: 0},內存地址:110911992 添加前字典{‘a‘: 0},內存地址:110911992 添加前字典{‘a‘: 1},內存地址:110911992 添加前字典{‘a‘: 1},內存地址:110911992 添加前字典{‘a‘: 2},內存地址:110911992 添加前字典{‘a‘: 2},內存地址:110911992 [({‘a‘: 2}, ‘內存地址:110911992‘), ({‘a‘: 2}, ‘內存地址:110911992‘), ({‘a‘: 2}, ‘內存地址:110911992‘)]
說明:
第二種情況
鍵入代碼:
1 def make(): 2 for a in range(3): 3 dict = { 4 ‘a‘: a 5 } 6 yield dict 7 8 list = [] 9 for val in make(): 10 print(‘添加前字典{},內存地址:{}‘.format(val,id(val))) 11 list.append((val,‘內存地址:%d‘ % id(val))) 12 print(‘添加前字典{},內存地址:{}‘.format(val,id(val))) 13 14 print(list)
得到結果:
1 添加前字典{‘a‘: 0},內存地址:113784728 2 添加前字典{‘a‘: 0},內存地址:113784728 3 添加前字典{‘a‘: 1},內存地址:110699936 4 添加前字典{‘a‘: 1},內存地址:110699936 5 添加前字典{‘a‘: 2},內存地址:110699144 6 添加前字典{‘a‘: 2},內存地址:110699144 7 [({‘a‘: 0}, ‘內存地址:113784728‘), ({‘a‘: 1}, ‘內存地址:110699936‘), ({‘a‘: 2}, ‘內存地址:110699144‘)]
十大經典排序算法