十大经典排序算法总结
十種常見排序算法可以分為兩大類:
非線性時間比較類排序:通過比較來決定元素間的相對次序,由于其時間復雜度不能突破O(nlogn),因此稱為非線性時間比較類排序。
線性時間非比較類排序:不通過比較來決定元素間的相對次序,它可以突破基于比較排序的時間下界,以線性時間運行,因此稱為線性時間非比較類排序。
各排序算法復雜度及穩定性:
 相關概念
穩定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
不穩定:如果a原本在b的前面,而a=b,排序之后 a 可能會出現在 b 的后面。
時間復雜度:
1.時間復雜度
 一般情況下,算法中基本操作重復執行的次數是問題規模n的某個函數,用T(n)表示,若有某個輔助函數f(n),使得當n趨近于無窮大時,T(n)/f(n)的極限值為不等于零的常數,則稱f(n)是T(n)的同數量級函數。記作T(n)=O(f(n)),稱O(f(n)) 為算法的漸進時間復雜度,簡稱時間復雜度。
 上面這一段解釋是很規范的,但是對于非專業性的我們來說并不是那么好理解,說白了時間復雜度就是時間復雜度的計算并不是計算程序具體運行的時間,而是算法執行語句的次數。通常我們計算時間復雜度都是計算最壞情況 。
最壞時間復雜度和平均時間復雜度
  最壞情況下的時間復雜度稱最壞時間復雜度。一般不特別說明,討論的時間復雜度均是最壞情況下的時間復雜度。
  這樣做的原因是:最壞情況下的時間復雜度是算法在任何輸入實例上運行時間的上界,這就保證了算法的運行時間不會比任何更長。
  平均時間復雜度是指所有可能的輸入實例均以等概率出現的情況下,算法的期望運行時間。設每種情況的出現的概率為pi,平均時間復雜度則為sum(pi*f(n))
空間復雜度:
一個程序的空間復雜度是指運行完一個程序所需內存的大小。利用程序的空間復雜度,可以對程序的運行所需要的內存多少有個預先估計。一個程序執行時除了需要存儲空間和存儲本身所使用的指令、常數、變量和輸入數據外,還需要一些對數據進行操作的工作單元和存儲一些為現實計算所需信息的輔助空間。程序執行時所需存儲空間包括以下兩部分。  
 (1)固定部分。這部分空間的大小與輸入/輸出的數據的個數多少、數值無關。主要包括指令空間(即代碼空間)、數據空間(常量、簡單變量)等所占的空間。這部分屬于靜態空間。
 (2)可變空間,這部分空間的主要包括動態分配的空間,以及遞歸棧所需的空間等。這部分的空間大小與算法有關。
 一個算法所需的存儲空間用f(n)表示。S(n)=O(f(n))  其中n為問題的規模,S(n)表示空間復雜度。
穩定性:
所謂穩定性是指待排序的序列中有兩元素相等,排序之后它們的先后順序不變.假如為A1,A2.它們的索引分別為1,2.則排序之后A1,A2的索引仍然是1和2.
穩定也可以理解為一切皆在掌握中,元素的位置處在你在控制中.而不穩定算法有時就有點碰運氣,隨機的成分.當兩元素相等時它們的位置在排序后可能仍然相同.但也可能不同.是未可知的.
另外要注意的是:算法思想的本身是獨立于編程語言的,所以你寫代碼去實現算法的時候很多細節可以做不同的處理.采用不穩定算法不管你具體實現時怎么寫代碼,最終相同元素位置總是不確定的(可能位置沒變也可能變了).而穩定排序算法是你在具體實現時如果細節方面處理的好就會是穩定的,但有些細節沒處理得到的結果仍然是不穩定的.
比如冒泡排序,直接插入排序,歸并排序雖然是穩定排序算法,但如果你實現時細節沒處理好得出的結果也是不穩定的.
穩定性的用處
我們平時自己在使用排序算法時用的測試數據就是簡單的一些數值本身.沒有任何關聯信息.這在實際應用中一般沒太多用處.實際應該中肯定是排序的數值關聯到了其他信息,比如數據庫中一個表的主鍵排序,主鍵是有關聯到其他信息.另外比如對英語字母排序,英語字母的數值關聯到了字母這個有意義的信息.
可能大部分時候我們不用考慮算法的穩定性.兩個元素相等位置是前是后不重要.但有些時候穩定性確實有用處.它體現了程序的健壯性.比如你網站上針對最熱門的文章或啥音樂電影之類的進行排名.由于這里排名不會像我們成績排名會有并列第幾名之說.所以出現了元素相等時也會有先后之分.如果添加進新的元素之后又要重新排名了.之前并列名次的最好是依然保持先后順序才比較好.
冒泡排序:https://blog.csdn.net/alzzw/article/details/97906690
選擇排序:https://blog.csdn.net/alzzw/article/details/97964320
插入排序:https://blog.csdn.net/alzzw/article/details/97967278
快速排序:https://blog.csdn.net/alzzw/article/details/97970371
歸并排序:https://blog.csdn.net/alzzw/article/details/98047030
堆排序:https://blog.csdn.net/alzzw/article/details/98087519
基數排序:https://blog.csdn.net/alzzw/article/details/98240042
計數排序:https://blog.csdn.net/alzzw/article/details/98245871
參考:https://blog.csdn.net/xiaoxiaojie12321/article/details/81380834
https://blog.csdn.net/guoke2017/article/details/80929134
總結
以上是生活随笔為你收集整理的十大经典排序算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: c++ 数组的输入遇到特定字符停止输入_
- 下一篇: 学习Winform了解到switch和i
