1. 程式人生 > 其它 >排序演算法(Sort Algorithm)

排序演算法(Sort Algorithm)

排序演算法的介紹

排序也稱排序演算法(Sort Algorithm),排序是將一組資料,依指定的順序進行排列的過程

排序的分類:

1) 內部排序:

指將需要處理的所有資料都載入到內部儲存器(記憶體)中進行排序。

2) 外部排序法:

資料量過大,無法全部載入到記憶體中,需要藉助外部儲存(檔案等)進行排序。

3) 常見的排序演算法分類(圖):

演算法的時間複雜度

時間複雜度

1) 一般情況下,演算法中的基本操作語句的重複執行次數是問題規模 n 的某個函式,用 T(n)表示,若有某個輔

助函式 f(n),使得當 n 趨近於無窮大時,T(n) / f(n) 的極限值為不等於零的常數,則稱 f(n)是 T(n)的同數量級函式。

記作 T(n)=( f(n) ),稱O( f(n) ) 為演算法的漸進時間複雜度,簡稱時間複雜度。

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

度相同,都為 O(n²)

3) 計算時間複雜度的方法:

 用常數 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²)

常見的時間複雜度

1) 常數階 O(1)

2) 對數階 O(log2n)

3) 線性階 O(n)

4) 線性對數階 O(nlog2n)

5) 平方階 O(n^2)

6) 立方階 O(n^3)

7) k 次方階 O(n^k)

8) 指數階 O(2^n)

說明:參考上面的 O(n²) 去理解就好了,O(n³)相當於三層 n 迴圈,其它的類似

常見的時間複雜度對應的圖

1) 常見的演算法時間複雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)< Ο(nk) <

Ο(2n) ,隨著問題規模 n 的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低

2) 從圖中可見,我們應該儘可能避免使用指數階的演算法

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

1) 平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,該演算法的執行時間。

2) 最壞情況下的時間複雜度稱最壞時間複雜度。一般討論的時間複雜度均是最壞情況下的時間複雜度。這樣做的

原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的界限,這就保證了演算法的執行時間不會

比最壞情況更長。

3) 平均時間複雜度和最壞時間複雜度是否一致,和演算法有關(如圖:)

演算法的空間複雜度簡介

1) 類似於時間複雜度的討論,一個演算法的空間複雜度(Space Complexity)定義為該演算法所耗費的儲存空間,它也是

問題規模 n 的函式。

2) 空間複雜度(Space Complexity)是對一個演算法在執行過程中臨時佔用儲存空間大小的量度。有的演算法需要佔用的

臨時工作單元數與解決問題的規模 n 有關,它隨著 n 的增大而增大,當 n 較大時,將佔用較多的儲存單元,例

如快速排序和歸併排序演算法, 基數排序就屬於這種情況

3) 在做演算法分析時,主要討論的是時間複雜度。從使用者使用體驗上看,更看重的程式執行的速度。一些快取產品

(redis, memcache)和演算法(基數排序)本質就是用空間換時間