排序算法 之四 分类、时间/空间复杂度、如何选择
生活随笔
收集整理的這篇文章主要介紹了
排序算法 之四 分类、时间/空间复杂度、如何选择
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
寫在前面
??現在網上關于排序算法的文檔不計其數,為什么要寫這篇文章呢?主要是因為一些算法雖然在平時有用到,但是從來沒有細細整理過,沒有個統一、整體的認識。寫這篇文章一來是進行一下總結,二來趁機再系統的學一下各排序算法!
分類
根據不同的分類標準,排序算法的分類有很多種,下面重點介紹幾種。
-
根據待排序的數據量大小不同,使得排序過程中所涉及的存儲器不同,可以分為:
- 內部排序: 待排序的內容在內存中就可以完成。
- 外部排序: 待排序的記錄存儲在外存儲器上,待排序的數據無法一次裝入內存,需要在內存和外部存儲器之間進行多次數據交換,以達到排序所有數據的目的。
??外部排序最常用的算法是 多路歸并排序,即將原始數據分解成多個能夠一次性裝入內存的部分,分別把每一部分調入內存完成排序。然后,對已經排序的子文件進行多路歸并排序。這種歸并方法可分為兩個不同的階段: - 采用適當的內部排序方法對劃分好的每個數據片段進行排序,將排好序的片段(稱為歸并段)寫到外部存儲器中(通常由一個可用的磁盤作為臨時緩沖區),這樣臨時緩沖區中的每個歸并段的內容是有序的。
- 利用歸并算法,歸并第一階段生成的歸并段,直到只剩下一個歸并段為止。
根據排序關鍵字可能出現重復,根據重復關鍵字的排序情況可分為:
- 穩定排序: 排序后重復關鍵字記錄的相對次序保持不變。例如,如果a原本在b前面,而 a=b,排序之后a仍然在b的前面。
- 不穩定排序: 排序后重復關鍵字記錄的相對次序可能改變。例如,如果a原本在b的前面,而 a = b,排序之后 a 可能會出現在 b 的后面。
根據排序的實現策略可分為:
- 比較類排序: 依賴于比較和交換來將元素移動到正確的位置上,由于其時間復雜度不能突破O(nlogn),因此也稱為 非線性時間比較類排序。
- 非比較類排序: 不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此也稱為 線性時間非比較類排序。
對于線性時間排序,它的運行時間往往與它處理的數據元素個數成正比,即為O(n)。線性排序的缺點是它需要依賴于數據集合中的某些特征,所以我們并不是在所有的場合都能夠使用它。
時間/空間復雜度
如何選擇
??排序算法可以說是一項基本功,是《數據結構與算法》中最基本的算法之一。實際工作中或多或少都會用到那么一兩個。合理選擇一種排序算法,對于一個項目程序的設計是非常重要的!
??選擇合適算法就和選擇對象一樣,最適合的才是最好的! 影響選擇排序算法的因素有很多,例如時間復雜度和空間復雜度可以說是個重要的參考標準。但是,平均時間復雜度低的算法并不一定就是最優的選擇。相反,有時候,平均時間復雜度高的算法反而更加適合自己的實際情況。一般來說,主要就是依據以下這幾點:
- 數據規模: 在實際項目中,通常這是第一個要考慮的點。通過對于數據規模的把握,可以縮小我們算法的選擇范圍。在很小的數據量時,就現在的處理器水平而言,選擇絕大多數算法都看不出差異!一旦數據量變大,算法的差異性就會體現的越明顯。
- 時間復雜度: 在絕大多數情況下,這都是一個決定性的因素。因為在實際情況下,最看重的往往就是算法的執行效率。常見的算法時間復雜度由小到大依次為:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)。
- 空間復雜度: 這點通常不是我們首先需要考慮的條件。甚至于計算下編程我們根本不考慮這點。但是,在嵌入式編程中還是有必要考慮的。
- 算法的難易程度: 想想在嵌入式編程中,去實現一個最佳歸并樹是否有必要!
當然,在實際情況下,通常需要多種排序算法來組合使用!綜合以上三點,當數據量較大,則應采用時間復雜度為O(nlog2n)的排序方法。例如,快速排序、堆排序或歸并排序序。當數據量很小時,選擇最簡單的算法即可!
總結
以上是生活随笔為你收集整理的排序算法 之四 分类、时间/空间复杂度、如何选择的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM 之九 Cortex-M/R 内核
- 下一篇: CAN 总线 之一 总线拓扑、物理电平、