[資料結構與演算法] 排序演算法

時間靜止不是簡史發表於2020-02-08

終於學習到了演算法部分, 在學習演算法時, 我們還是應該回顧一下資料結構與演算法之間的關係

  • 資料結構是研究資料的組織方式, 是演算法的基礎
  • 演算法是解決程式設計問題的方法論, 是程式的靈魂
  • 程式= 資料結構+演算法

排序演算法

排序也稱排序演算法(Sort algorithm). 是指 將一組資料按照指定順序進行排列的過程
主要分為內部排序外部排序

  • 內部排序: 指將需要處理的資料載入到記憶體中進行排序
  • 外部排序: 由於資料量較大, 無法全部載入到記憶體, 還需要藉助外部儲存進行排序

排序演算法的分類如下:
在這裡插入圖片描述
由上圖可知, 如果是面試官問你看常見排序方法有多少種?
由於現在我們需要掌握的演算法水平要求比較高, 最好將所有的都寫出來

  • 直接插入排序
  • 希爾排序
  • 簡單選擇排序
  • 堆排序
  • 氣泡排序
  • 快速排序
  • 歸併排序
  • 基數排序

演算法的複雜度

演算法複雜度是指演算法在編寫成可執行程式後,執行時所需要的資源,資源包括時間資源和記憶體資源。應用於數學和計算機導論。

度量一個程式(演算法)執行時間的兩種方法

  • 事前估算的方法
    通過分析某個演算法的時間複雜度來判斷哪個演算法更優.

  • 事後統計的方法
    這種方法可行, 但是有兩個問題:一是要想對設計的演算法的執行,需要實際執行該程式;二是所得時間的統計量依賴於計算機的硬體、軟體等環境因素, 這種方式,要在同一臺計算機的相同狀態下執行,才能比較那個演算法速度更快。

演算法的時間複雜度

時間頻度: 一個演算法中的語句執行次數稱為語句頻度或時間頻度。記為T(n)

注意事項

  • 最高項為n時, 可忽略常數項
    在這裡插入圖片描述
    結論:
    2n+20 和 2n 隨著n 變大,執行曲線無限接近, 20可以忽略
    3n+10 和 3n 隨著n 變大,執行曲線無限接近, 10可以忽略

  • 最高項為n^2 時, 可忽略 n前的係數和常數項
    在這裡插入圖片描述
    結論:
    2n^2+3n+10 和 2n^2 隨著n 變大, 執行曲線無限接近, 可以忽略 3n+10
    n^2+5n+20 和 n^2 隨著n 變大,執行曲線無限接近, 可以忽略 5n+20

  • 最高項為n^3以上時, 可以忽略低次項n 和常數項
    在這裡插入圖片描述
    結論:
    隨著n值變大,5n^2+7n 和 3n^2 + 2n ,執行曲線重合, 說明 這種情況下, 5和3可以忽略。
    而n^3+5n 和 6n^3+4n ,執行曲線分離(得到一個固定比值),說明多少次方式關鍵

時間複雜度

一般情況下,演算法中的基本操作語句的重複執行次數是問題規模n的某個函式,用T(n)表示,若有某個輔助函式f(n),使得當n趨近於無窮大時,T(n) / f(n) 的極限值為不等於零的常數,則稱f(n)是T(n)的同數量級函式。記作 T(n)=O( f(n) ),稱O( f(n) ) 為演算法的漸進時間複雜度,簡稱時間複雜度

T(n) 不同,但時間複雜度可能相同。
如:T(n)=n²+7n+6 與 T(n)=3n²+2n+2 它們的T(n) 不同,但時間複雜度相同,都為O(n²)。

計算時間複雜度的方法:

  • 用常數1代替執行時間中的所有加法常數 T(n)=n²+7n+6 => T(n)=n²+7n+1
  • 修改後的執行次數函式中,只保留最高階項 T(n)=n²+7n+1 => T(n) = n²
  • 去除最高階項的係數 T(n) = n² => T(n) = n² => O(n²)

常見的時間複雜度
在這裡插入圖片描述

平均時間複雜度和最壞時間複雜度

  • 平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,該演算法的執行時間。
  • 最壞情況下的時間複雜度稱最壞時間複雜度。一般討論的時間複雜度均是最壞情況下的時間複雜度。
    這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的界限,這就保證了演算法的執行時間不會比最壞情況更長。
  • 平均時間複雜度和最壞時間複雜度是否一致,和演算法有關(如圖:)。
    在這裡插入圖片描述

空間複雜度

  • 一個演算法的空間複雜度(Space Complexity)定義為該演算法所耗費的儲存空間,它也是問題規模n的函式。

  • 空間複雜度(Space Complexity)是對一個演算法在執行過程中臨時佔用儲存空間大小的量度。有的演算法需要佔用的臨時工作單元數與解決問題的規模n有關,它隨著n的增大而增大,當n較大時,將佔用較多的儲存單元,例如快速排序和歸併排序演算法就屬於這種情況

  • 在做演算法分析時,主要討論的是時間複雜度 。從使用者使用體驗上看,更看重的程式執行的速度。一些快取產品(redis, memcache)和演算法(基數排序) 本質就是用空間換時間.

而下面, 我們將通過對以上這些演算法的學習, 來了解其原理和實現以及時間複雜度

相關文章