標籤:排序 演算法 複雜度
常用的排序演算法的時間複雜度和空間複雜度
排序法 |
最差時間分析 |
平均時間複雜度 |
穩定度 |
空間複雜度 |
冒泡排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
快速排序 |
O(n2) |
O(n*log2n) |
不穩定 |
O(log2n)~O(n) |
選擇排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
二叉樹排序 |
O(n2) |
O(n*log2n) |
不一頂 |
O(n) |
插入排序 |
O(n2) |
O(n2) |
穩定 |
O(1) |
堆排序 |
O(n*log2n) |
O(n*log2n) |
不穩定 |
O(1) |
希爾排序 |
O |
O |
不穩定 |
O(1) |
1、時間複雜度
(1)時間頻度 一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機運行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)。
(2)時間複雜度 在剛才提到的時間頻度中,n稱為問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。 一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為演算法的漸進時間複雜度,簡稱時間複雜度。
在各種不同演算法中,若演算法中語句執行次數為一個常數,則時間複雜度為O(1),另外,在時間頻度不相同時,時間複雜度有可能相同,如T(n)=n2+3n+4與T(n)=4n2+2n+1它們的頻度不同,但時間複雜度相同,都為O(n2)。 按數量級遞增排列,常見的時間複雜度有:常數階O(1),對數階O(log2n),線性階O(n), 線性對數階O(nlog2n),平方階O(n2),立方階O(n3),..., k次方階O(nk),指數階O(2n)。隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。 2、空間複雜度 與時間複雜度類似,空間複雜度是指演算法在電腦內執行時所需儲存空間的度量。記作: S(n)=O(f(n)) 我們一般所討論的是除正常佔用記憶體開銷外的輔助儲存單元規模。討論方法與時間複雜度類似,不再贅述。
(3)漸進時間複雜度評價演算法時間效能 主要用演算法時間複雜度的數量級(即演算法的漸近時間複雜度)評價一個演算法的時間效能。
2、類似於時間複雜度的討論,一個演算法的空間複雜度(Space Complexity)S(n)定義為該演算法所耗費的儲存空間,它也是問題規模n的函數。漸近空間複雜度也常常簡稱為空白間複雜度。
空間複雜度(Space Complexity)是對一個演算法在運行過程中臨時佔用儲存空間大小的量度。一個演算法在電腦儲存空間上所佔用的儲存空間,包括儲存演算法本身所佔用的儲存空間,演算法的輸入輸出資料所佔用的儲存空間和演算法在運行過程中臨時佔用的儲存空間這三個方面。演算法的輸入輸出資料所佔用的儲存空間是由要解決的問題決定的,是通過參數表由調用函數傳遞而來的,它不隨本演算法的不同而改變。儲存演算法本身所佔用的儲存空間與演算法書寫的長短成正比,要壓縮這方面的儲存空間,就必須編寫出較短的演算法。演算法在運行過程中臨時佔用的儲存空間隨演算法的不同而異,有的演算法只需要佔用少量的臨時工作單元,而且不隨問題規模的大小而改變,我們稱這種演算法是“就地/"進行的,是節省儲存的演算法,如這一節介紹過的幾個演算法都是如此;有的演算法需要佔用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將佔用較多的儲存單元,例如將在第九章介紹的快速排序和歸併排序演算法就屬於這種情況。
如當一個演算法的空間複雜度為一個常量,即不隨被處理資料量n的大小而改變時,可表示為O(1);當一個演算法的空間複雜度與以2為底的n的對數成正比時,可表示為0(10g2n);當一個演算法的空I司複雜度與n成線性比例關係時,可表示為0(n).若形參為數組,則只需要為它分配一個儲存由實參傳送來的一個地址指標的空間,即一個機器字長空間;若形參為引用方式,則也只需要為其分配儲存一個地址的空間,用它來儲存對應實參變數的地址,以便由系統自動引用實參變數。
【電腦基礎】 常用的排序演算法的時間複雜度和空間複雜度