1. 程式人生 > >資料結構-排序總結(冒泡 插入 選擇 歸併)

資料結構-排序總結(冒泡 插入 選擇 歸併)

在我們看到,無論是氣泡排序,插入排序或者是選擇排序,時間複雜度都可能是是O(N^2).

為什麼這三種排序時間複雜度都有可能是N^2而二路歸併是O(NLog(N))?
讓我們先看看前三種排序方法:

  • 氣泡排序:通過比較,將較大(較小)的向後移動
  • 選擇排序:通過比較,將前面的與後面最大(最小)的交換位置
  • 插入排序:通過比較,將後面較大的挨個與前面做比較,符合條件的移動位置

    相應的時間複雜度:

  • 氣泡排序:O(N^2)
  • 選擇排序:O(N^2)
  • 插入排序:最好情況:O(N)最壞情況:O(N^2)

通過以上排序方式,我們都不難發現,這些排序其實是在做兩種事情,一個是比較,一個是按照比較的結果做出位置的變換.其中位置的變換是限制在一個數的範圍內的,也就是說,每次比較,結果的資訊都影響到一個數的變換,或者是交換位置,或者是往前往後移動.
兩個數比較,對位置操作只保留一個數的比較資訊,這樣就會丟失另一個比較數的資訊.
而二路歸併很好的解決了這個問題.
這裡寫圖片描述


假設,我們對8個數進行排序,一個藍色方格代表一個數,方格上的斜線表示從小到大排序後結果.
一共進行3(log2(8)=3)個大次排序
每個大次內部又有N次比較和交換,並且比較的兩個數的結果都已位置方式保留了下來,這樣在以後的排序中,兩個數儲存的順序作為後面排序的參考,這樣減少了一部分比較次數.
因此歸併排序時間複雜度為O(N*log2(N))
歸併排序,不足之處在於他的空間複雜度為O(N),這個不難理解,N個元素排序,需要開闢一塊N個長度的記憶體空間,這樣在排列眾多數的時候,對儲存的空間要求就很多了.而氣泡排序,插入排序,選擇排序,空間複雜度為O(1),他們只有了幾個記憶體空間儲存當前比較結果,所以就少了很多空間.因此,在實際情況中,要注意選擇適合的排序方法.