這兩天看了幾個排序演算法,一直在思考乙個問題,為什麼歸併排序就會比插入排序等初級排序演算法的複雜度小呢?因為歸併排序每次都把元素往正確的方向移動?還是有比較「記憶」,前面的比較優化了後面的比較?
用4個數進行模擬,
假如有abcd 4個數的序列,要進行公升序排序。
對於插入排序,最壞的情況就是a>b>c>d,這樣要比較次數為6次,排序過程如下:
bacd
bcad
cbad
cbda
cdba
dcba
這種情況下,每個數都要和其他數進行比較。
而如果用歸併排序,最壞的一種情況是a
那麼需要比較的有5次:
a-b, c-d
a-c, c-b, b-d
比插入的少了一次a-d,因為a比c小,所以不需要再跟d進行比較,這就是比較的「記憶」,當然這只是4個數的情況,當數越多,這種記憶的優勢會更加明顯,最終導致歸併排序的複雜度要遠遠小於插入排序。
另外,歸併排序過程中數字可以遠距離移動,而插入排序(不包括希爾排序)只能逐位進行移動,這也是歸併排序更優的另乙個原因。
插入排序 歸併排序
插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...
插入排序 歸併排序
演算法導論初涉,第一講練習內容 include define n 6 int a n void init 初始化陣列 a i 1 k void output int a,int n void merge int low,int mid,int high while s mid b i a s whi...
插入排序 歸併排序
一直沒自己寫過 然後自己寫了下 其實我主要查的wikipedia 插入排序 歸併排序 先插排 插入排序 英語 insertion sort 是一種簡單直觀的 排序演算法 它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序 在實現上,通常採用in ...