1 快速排序(QuickSort)
快速排序是一個就地排序,分而治之,大規模遞歸的算法。從本質上來講,它是歸併排序的就地版本。快速排序能夠由下面四步組成。
(1) 若是很少於1個數據,直接返回。
(2) 通常選擇序列最左邊的值做爲支點數據。
(3) 將序列分紅2部分,一部分都大於支點數據,另一部分都小於支點數據。
(4) 對兩邊利用遞歸排序數列。
快速排序比大部分排序算法都要快。儘管咱們能夠在某些特殊的狀況下寫出比快速排序快的算法,可是就一般狀況而言,沒有比它更快的了。快速排序是遞歸的,對於內存很是有限的機器來講,它不是一個好的選擇。
2 歸併排序(MergeSort)
歸併排序先分解要排序的序列,從1分紅2,2分紅4,依次分解,當分解到只有1個一組的時候,就能夠排序這些分組,而後依次合併回原來的序列中,這樣就能夠排序全部數據。合併排序比堆排序稍微快一點,可是須要比堆排序多一倍的內存空間,由於它須要一個額外的數組。
3 堆排序(HeapSort)
堆排序適合於數據量很是大的場合(百萬數據)。
堆排序不須要大量的遞歸或者多維的暫存數組。這對於數據量很是巨大的序列是合適的。好比超過數百萬條記錄,由於快速排序,歸併排序都使用遞歸來設計算法,在數據量很是大的時候,可能會發生堆棧溢出錯誤。
堆排序會將全部的數據建成一個堆,最大的數據在堆頂,而後將堆頂數據和序列的最後一個數據交換。接下來再次重建堆,交換數據,依次下去,就能夠排序全部的數據。
4 Shell排序(ShellSort)
Shell排序經過將數據分紅不一樣的組,先對每一組進行排序,而後再對全部的元素進行一次插入排序,以減小數據交換和移動的次數。平均效率是O(nlogn)。其中分組的合理性會對算法產生重要的影響。如今多用D.E.Knuth的分組方法。
Shell排序比冒泡排序快5倍,比插入排序大體快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢不少。可是它相對比較簡單,它適合於數據量在5000如下而且速度並非特別重要的場合。它對於數據量較小的數列重複排序是很是好的。
5 插入排序(InsertSort)
插入排序經過把序列中的值插入一個已經排序好的序列中,直到該序列的結束。插入排序是對冒泡排序的改進。它比冒泡排序快2倍。通常不用在數據大於1000的場合下使用插入排序,或者重複排序超過200數據項的序列。
6 冒泡排序(BubbleSort)
冒泡排序是最慢的排序算法。在實際運用中它是效率最低的算法。它經過一趟又一趟地比較數組中的每個元素,使較大的數據下沉,較小的數據上升。它是O(n^2)的算法。
7 交換排序(ExchangeSort)和選擇排序(SelectSort)
這兩種排序方法都是交換方法的排序算法,效率都是 O(n2)。在實際應用中處於和冒泡排序基本相同的地位。它們只是排序算法發展的初級階段,在實際中使用較少。
8 基數排序(RadixSort)
基數排序和一般的排序算法並不走一樣的路線。它是一種比較新穎的算法,可是它只能用於整數的排序,若是咱們要把一樣的辦法運用到浮點數上,咱們必須瞭解浮點數的存儲格式,並經過特殊的方式將浮點數映射到整數上,而後再映射回去,這是很是麻煩的事情,所以,它的使用一樣也很少。並且,最重要的是,這樣算法也須要較多的存儲空間。
9 總結
下面是一個總的表格,大體總結了咱們常見的全部的排序算法的特色。
排序法 平均時間 最差情形 穩定度 額外空間 備註
冒泡 O(n2) O(n2) 穩定 O(1) n小時較好
交換 O(n2) O(n2) 不穩定 O(1) n小時較好
選擇 O(n2) O(n2) 不穩定 O(1) n小時較好
插入 O(n2) O(n2) 穩定 O(1) 大部分已排序時較好
基數 O(logRB) O(logRB) 穩定 O(n)
B是真數(0-9),
R是基數(個十百)
Shell O(nlogn) O(ns) 1<s<2 不穩定 O(1) s是所選分組
快速 O(nlogn) O(n2) 不穩定 O(nlogn) n大時較好
歸併 O(nlogn) O(nlogn) 穩定 O(1) n大時較好
堆 O(nlogn) O(nlogn) 不穩定 O(1) n大時較好
算法