數據結構和算法(Golang實現)(18)排序算法-前言

排序算法

人類的發展中,咱們學會了計數,好比知道小明今天打獵的兔子的數量是多少。另一方面,咱們也須要判斷,今天哪一個人打獵打得多,咱們須要比較。算法

因此,排序這個很天然的需求就出來了。好比小明打了5只兔子,小王打了8只,還有部落其餘一百多我的也打了。咱們要論功行賞,誰打得多,誰就獎賞大一點。編程

如何排序呢,怎麼在最快的時間內,找到打兔子最多的人呢,這是一個很樸素的問題。segmentfault

通過不少年的研究,出現了不少的排序算法,有快的有慢的。好比:數組

  1. 插入類排序有:直接插入排序和希爾排序
  2. 選擇類排序有:直接選擇排序和堆排序
  3. 交換類排序有:冒泡排序和快速排序

它們的複雜度以下:數據結構

穩定性概念
定義:能保證兩個相等的數,通過排序以後,其在序列的先後位置順序不變。(A1=A2,排序前A1在A2前面,排序後A1還在A2前面)
意義:穩定性本質是維持具備相同屬性的數據的插入順序,若是後面須要使用該插入順序排序,則穩定性排序能夠避免此次排序。

冒泡排序能夠說是最差的排序算法。併發

咱們把冒泡排序,直接選擇排序,直接插入排序認爲是初級的排序算法,其中直接插入排序的性能是綜合最好的,通常來講,當排序數組規模n較小時,直接插入排序可能比任何排序算法都要快,建議只在小規模排序中使用。數據結構和算法

希爾排序是對直接插入排序的改進版本,比直接選擇排序和直接插入排序快,且隨着規模的遞增,這種性能提高越明顯。由於算法容易理解,在排序數組中等規模下,咱們可使用它。在很是大的規模下,它的性能也不那麼糟糕,但大規模排序仍是建議使用如下的高級排序算法。函數

快速排序,歸併排序和堆排序是比較高級的排序算法。性能

目前被認爲綜合最好的高級排序算法是快速排序,快速排序的平均用時最短,大多數的編程庫內置的排序算法都是它。spa

堆排序也是一種很快的排序算法,經過維持一顆二叉樹,樹的根節點老是最大或最小從而可實現排序。

歸併排序和快速排序同樣使用分治法,遞歸地先使每一個子序列有序,再將兩個有序的序列進行合併成一個有序的序列。

咱們在這一章將會講解不一樣的排序算法。

系列文章入口

我是陳星星,歡迎閱讀我親自寫的 數據結構和算法(Golang實現),文章首發於 閱讀更友好的GitBook

相關文章
相關標籤/搜索