1. 程式人生 > >排序算法的時間復雜度 (轉載)

排序算法的時間復雜度 (轉載)

alt 位置 並且 pos 時間復雜度 star 下標 記錄 交換

各種排序算法的穩定性和時間復雜度小結

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

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

技術分享圖片
冒泡排序是穩定的,算法時間復雜度是O(n ^2)。  
 2.2 選擇排序(Selection Sort)   
選擇排序的基本思想是對待排序的記錄序列進行n-1遍的處理,第i遍處理是將L[i..n]中最小者與L[i]交換位置。這樣,經過i遍處理之後,前i個記錄的位置已經是正確的了。   選擇排序是不穩定的,算法復雜度是O(n ^2 )。   
2.3 插入排序 (Insertion Sort)   
插入排序的基本思想是,經過i-1遍處理後,L[1..i-1]己排好序。第i遍處理僅將L[i]插入L[1..i-1]的適當位置,使得L[1..i] 又是排好序的序列。要達到這個目的,我們可以用順序比較的方法。首先比較L[i]和L[i-1],如果L[i-1]≤ L[i],則L[1..i]已排好序,第i遍處理就結束了;否則交換L[i]與L[i-1]的位置,繼續比較L[i-1]和L[i-2],直到找到某一個位置j(1≤j≤i-1),使得L[j] ≤L[j+1]時為止。圖1演示了對4個元素進行插入排序的過程,共需要(a),(b),(c)三次插入。   直接插入排序是穩定的,算法時間復雜度是O(n ^2) 。  
2.4 堆排序   
堆排序是一種樹形選擇排序,在排序過程中,將A[n]看成是完全二叉樹的順序存儲結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關系來選擇最小的元素。   堆排序是不穩定的,算法時間復雜度O(nlog n)。   
2.5 歸並排序   
設有兩個有序(升序)序列存儲在同一數組中相鄰的位置上,不妨設為A[l..m],A[m+1..h],將它們歸並為一個有序數列,並存儲在A[l..h]。   其時間復雜度無論是在最好情況下還是在最壞情況下均是O(nlog2n)。   
2.6 快速排序   
快速排序是對冒泡排序的一種本質改進。它的基本思想是通過一趟掃描後,使得排序序列的長度能大幅度地減少。在冒泡排序中,一次掃描只能確保最大數值的數移到正確位置,而待排序序列的長度可能只減少1。快速排序通過一趟掃描,就能確保某個數(以它為基準點吧)的左邊各數都比它小,右邊各數都比它大。然後又用同樣的方法處理它左右兩邊的數,直到基準點的左右只有一個元素為止。   快速排序是不穩定的,最理想情況算法時間復雜度O(nlog2n),最壞O(n ^2)。  
2.7 希爾排序  
在直接插入排序算法中,每次插入一個數,使有序序列只增加1個節點,並且對插入下一個數沒有提供任何幫助。如果比較相隔較遠距離(稱為 增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。D.L.shell於1959年在以他名字命名的排序算法中實現了這一思想。算法先將要排序的一組數按某個增量d分成若幹組,每組中記錄的下標相差d.對每組中全部元素進行排序,然後再用一個較小的增量對它進行,在每組中再進行排序。當增量減到1時,整個要排序的數被分成一組,排序完成。  希爾排序是不穩定的,其時間復雜度為O(n ^2)。

排序算法的時間復雜度 (轉載)