在我們看到,無論是氣泡排序,插入排序或者是選擇排序,時間複雜度都可能是是o(n^2).
為什麼這三種排序時間複雜度都有可能是n^2而二路歸併是o(nlog(n))?
讓我們先看看前三種排序方法:
通過以上排序方式,我們都不難發現,這些排序其實是在做兩種事情,乙個是比較,乙個是按照比較的結果做出位置的變換.其中位置的變換是限制在乙個數的範圍內的,也就是說,每次比較,結果的資訊都影響到乙個數的變換,或者是交換位置,或者是往前往後移動.
兩個數比較,對位置操作只保留乙個數的比較資訊,這樣就會丟失另乙個比較數的資訊.
而二路歸併很好的解決了這個問題.
假設,我們對8個數進行排序,乙個藍色方格代表乙個數,方格上的斜線表示從小到大排序後結果.
一共進行3(log2(8)=3)個大次排序
每個大次內部又有n次比較和交換,並且比較的兩個數的結果都已位置方式保留了下來,這樣在以後的排序中,兩個數儲存的順序作為後面排序的參考,這樣減少了一部分比較次數.
因此歸併排序時間複雜度為o(n*log2(n))
歸併排序,不足之處在於他的空間複雜度為o(n),這個不難理解,n個元素排序,需要開闢一塊n個長度的記憶體空間,這樣在排列眾多數的時候,對儲存的空間要求就很多了.而氣泡排序,插入排序,選擇排序,空間複雜度為o(1),他們只有了幾個記憶體空間儲存當前比較結果,所以就少了很多空間.因此,在實際情況中,要注意選擇適合的排序方法.
冒泡,插入,選擇排序
經典的排序演算法,此文章介紹三個 氣泡排序 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。public void bubblesort int a while iswrap for int ...
Java 資料結構6 插入,選擇,氣泡排序演算法
插入排序 直接插入排序基本思想是每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。private static void insertionsort int array 然後將其放到找到的位置上 array j temp for int i 0 i array.le...
資料結構與演算法(十) 冒泡 插入 選擇排序演算法
演算法基本思想 假設原始序列為l,長度為n 三種排序演算法的比較 import copy def bubblesort l,n 氣泡排序 每次選出最大元素放在末尾 l 待排序列表 n 列表長度 for i in range n flag false for j in range n i 1 if l...