1. 程式人生 > >各種查詢和排序的時間複雜度

各種查詢和排序的時間複雜度

氣泡排序是穩定的,演算法時間複雜度是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)。

排序法 平均時間 最差情形 穩定度 額外空間 備註 
冒泡 O(n2)     O(n2) 穩定 O(1) n小時較好 
交換     O(n2)     O(n2) 不穩定 O(1) n小時較好 
選擇 O(n2) O(n2) 不穩定 O(1) n小時較好 
插入 O(n2) O(n2) 穩定 O(1) 大部分已排序時較好 
基數 O(logRB) O(logRB) 穩定 O(n) B是真數(0-9),
R是基數(個十百)
 
Shell O(nlogn) O(ns) 1