1. 程式人生 > >各種排序演算法的效能特點

各種排序演算法的效能特點

演算法的效能衡量

程式的執行效率:程式解決問題所需要的時間和佔用記憶體的多少

1.時間複雜度

時間頻度:

  • 一個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。
  • 但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。
  • 一個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)

  • 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)) 為演算法的漸進時間複雜度,簡稱時間複雜度。

2.空間複雜度

佔用記憶體:

  • 一個程式的空間複雜度是指執行完一個程式所需記憶體的大小。利用程式的空間複雜度,可以對程式的執行所需要的記憶體多少有個預先估計。
  • 一個程式執行時除了需要儲存空間和儲存本身所使用的指令、常數、變數和輸入資料外,還需要一些對資料進行操作的工作單元和儲存一些為現實計算所需資訊的輔助空間。
  • 程式執行時所需儲存空間包括以下兩部分

    1.固定部分。這部分空間的大小與輸入/輸出的資料的個數多少、數值無關。主要包括指令空間(即程式碼空間)、資料空間(常量、簡單變數)等所佔的空間。這部分屬於靜態空間
    2.可變空間,這部分空間的主要包括動態分配的空間,以及遞迴棧所需的空間等。這部分的空間大小與演算法有關。一個演算法所需的儲存空間用f(n)表示。S(n)=O(f(n)),其中n為問題的規模,S(n)表示空間複雜度

3.各種排序演算法效能特點

快速排序是最快的通用排序演算法

演算法 是否穩定 原地排序 時間複雜度 空間複雜度 備註資訊
選擇排序 \(N^{2}\) 1
插入排序 \(N\)~\(N^{2}\) 1 取決於元素的排列情況
希爾排序 \(NlogN\)? 1
堆排序 \(NlogN\) 1
歸併排序 \(NlogN\) $ N $
快速排序 \(NlogN\) \(lgN\) 執行效率由概率提供保證
三向快速排序 \(N\)~\(NlogN\) \(lgN\) 取決於元素的分佈情況