1. 程式人生 > >十大經典排序算法

十大經典排序算法

順序 yield 相等 tex 最簡 內存地址 直觀 內部 解釋

十大經典排序算法

主題:

排序算法可以分為內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存。常見的內部排序算法有:插入排序、希爾排序、選擇排序、冒泡排序、歸並排序、快速排序、堆排序、基數排序等。用一張圖概括:
技術分享圖片

關於時間復雜度:

  1. 平方階 (O(n2)) 排序 各類簡單排序:直接插入、直接選擇和冒泡排序。

  2. 線性對數階 (O(nlog2n)) 排序 快速排序、堆排序和歸並排序。

  3. O(n1+§)) 排序,§ 是介於 0 和 1 之間的常數。 希爾排序。

  4. 線性階 (O(n)) 排序 基數排序,此外還有桶、箱排序。

關於穩定性:

穩定的排序算法:冒泡排序、插入排序、歸並排序和基數排序。

不是穩定的排序算法:選擇排序、快速排序、希爾排序、堆排序。

名詞解釋:

n:數據規模

k:“桶”的個數

In-place:占用常數內存,不占用額外內存

Out-place:占用額外內存

穩定性:排序後 2 個相等鍵值的順序和排序之前它們的順序相同

第一種:冒泡排序

冒泡排序(Bubble Sort)也是一種簡單直觀的排序算法。它重復地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重復地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個算法的名字由來是因為越小的元素會經由交換慢慢“浮”到數列的頂端。

作為最簡單的排序算法之一,冒泡排序給我的感覺就像 Abandon 在單詞書裏出現的感覺一樣,每次都在第一頁第一位,所以最熟悉。冒泡排序還有一種優化算法,就是立一個 flag,當在一趟序列遍歷中元素沒有發生交換,則證明該序列已經有序。但這種改進對於提升性能來說並沒有什麽太大作用。

算法步驟

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。

  2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。

  3. 針對所有的元素重復以上的步驟,除了最後一個。

  4. 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。

動圖演示

技術分享圖片

得到結果:

添加前字典{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)] 

十大經典排序算法