最近開始找工做了,總結一些基本問題供複習。html
排序算法能夠說是一項基本功,解決實際問題中常常遇到,針對實際數據的特色選擇合適的排序算法可使程序得到更高的效率,有時候排序的穩定性仍是實際問題中必須考慮的,這篇博客對常見的排序算法進行整理,包括:插入排序、選擇排序、冒泡排序、快速排序、堆排序、歸併排序、希爾排序、二叉樹排序、計數排序、桶排序、基數排序。算法
比較排序和非比較排序shell
常見的排序算法都是比較排序,非比較排序包括計數排序、桶排序和基數排序,非比較排序對數據有要求,由於數據自己包含了定位特徵,全部才能不經過比較來肯定元素的位置。post
比較排序的時間複雜度一般爲O(n2)或者O(nlogn),比較排序的時間複雜度下界就是O(nlogn),而非比較排序的時間複雜度能夠達到O(n),可是都須要額外的空間開銷。ui
比較排序時間複雜度爲O(nlogn)的證實:url
a1,a2,a3……an序列的全部排序有n!種,因此知足要求的排序a1',a2',a3'……an'(其中a1'<=a2'<=a3'……<=an')的機率爲1/n!。基於輸入元素的比較排序,每一次比較的返回不是0就是1,這剛好能夠做爲決策樹的一個決策將一個事件分紅兩個分支。好比冒泡排序時經過比較a1和a2兩個數的大小能夠把序列分紅a1,a2……an與a2,a1……an(氣泡a2上升一個身位)兩種不一樣的結果,所以比較排序也能夠構造決策樹。根節點表明原始序列a1,a2,a3……an,全部葉子節點都是這個序列的重排(共有n!個,其中有一個就是咱們排序的結果a1',a2',a3'……an')。若是每次比較的結果都是等機率的話(剛好劃分爲機率空間相等的兩個事件),那麼二叉樹就是高度平衡的,深度至少是log(n!)。spa
又由於 1. n! < nn ,兩邊取對數就獲得log(n!)<nlog(n),因此log(n!) = O(nlogn).htm
2. n!=n(n-1)(n-2)(n-3)…1 > (n/2)^(n/2) 兩邊取對數獲得 log(n!) > (n/2)log(n/2) = Ω(nlogn),因此 log(n!) = Ω(nlogn)。blog
所以log(n!)的增加速度與 nlogn 相同,即 log(n!)=Θ(nlogn),這就是通用排序算法的最低時間複雜度O(nlogn)的依據。排序
1.穩定性比較
插入排序、冒泡排序、二叉樹排序、二路歸併排序及其餘線形排序是穩定的;
選擇排序、希爾排序、快速排序、堆排序是不穩定的。
2.時間複雜性比較
平均狀況 | 最好狀況 | 最壞狀況 | |
歸併排序 | O(nlogn) | O(nlogn) | O(nlogn) |
基數排序 | O(n) | O(n) | O(n) |
快速排序 | O(nlogn) | O(nlogn) | O(n2) |
希爾排序 | O(n1.5) | O(n) | O(n1.5) |
插入排序 | O(n2) | O(n) | O(n2) |
選擇排序 |
O(n2) | O(n2) | O(n2) |
3.輔助空間的比較
線形排序、二路歸併排序的輔助空間爲O(n),其它排序的輔助空間爲O(1);
4.其它比較
插入、冒泡排序的速度較慢,但參加排序的序列局部或總體有序時,這種排序能達到較快的速度。
反而在這種狀況下,快速排序反而慢了。
當n較小時,對穩定性不做要求時宜用選擇排序,對穩定性有要求時宜用插入或冒泡排序。
若待排序的記錄的關鍵字在一個明顯有限範圍內時,且空間容許是用桶排序。
當n較大時,關鍵字元素比較隨機,對穩定性沒要求宜用快速排序。
當n較大時,關鍵字元素可能出現自己是有序的,對穩定性有要求時,空間容許的狀況下。
宜用歸併排序。
當n較大時,關鍵字元素可能出現自己是有序的,對穩定性沒有要求時宜用堆排序。
=============================================================================
相關知識介紹(全部定義只爲幫助讀者理解相關概念,並不是嚴格定義):
一、穩定排序和非穩定排序
簡單地說就是全部相等的數通過某種排序方法後,仍能保持它們在排序以前的相對次序,咱們就
說這種排序方法是穩定的。反之,就是非穩定的。
好比:一組數排序前是a1,a2,a3,a4,a5,其中a2=a4,通過某種排序後爲a1,a2,a4,a3,a5,
則咱們說這種排序是穩定的,由於a2排序前在a4的前面,排序後它仍是在a4的前面。假如變成a1,a4,
a2,a3,a5就不是穩定的了。
二、內排序和外排序
在排序過程當中,全部須要排序的數都在內存,並在內存中調整它們的存儲順序,稱爲內排序;
在排序過程當中,只有部分數被調入內存,並藉助內存調整數在外存中的存放順序排序方法稱爲外排序。
三、算法的時間複雜度和空間複雜度
所謂算法的時間複雜度,是指執行算法所須要的計算工做量。
一個算法的空間複雜度,通常是指執行這個算法所須要的內存空間。
排序的穩定性和複雜度
不穩定:
選擇排序(selection sort)— O(n2)
快速排序(quicksort)— O(nlogn) 平均時間, O(n2) 最壞狀況; 對於大的、亂序串列通常認爲是最快的已知排序
堆排序 (heapsort)— O(nlogn)
希爾排序 (shell sort)— O(nlogn)
基數排序(radix sort)— O(n·k); 須要 O(n) 額外存儲空間 (K爲特徵個數)
穩定:
插入排序(insertion sort)— O(n2)
冒泡排序(bubble sort) — O(n2)
歸併排序 (merge sort)— O(n log n); 須要 O(n) 額外存儲空間
二叉樹排序(Binary tree sort) — O(nlogn); 須要 O(n) 額外存儲空間
計數排序 (counting sort) — O(n+k); 須要 O(n+k) 額外存儲空間,k爲序列中Max-Min+1
桶排序 (bucket sort)— O(n); 須要 O(k) 額外存儲空間