排序是工做和生活中很是常見的一個問題。如今已經有比較成熟的排序技術,被普遍地應用於各類程序語言或數據庫中。不一樣的排序算法有不一樣的性能和適用場景,下面的視頻對比了 9 種排序算法的性能表現。排序算法依次爲選擇排序、希爾排序、插入排序、歸併排序、快速排序、堆排序、冒泡排序、梳排序、雞尾酒排序。算法
九種排序算法的可視化及比較數據庫
冒泡排序(Bubble Sort)是一種交換排序,基本思想是:兩兩比較相鄰記錄的關鍵字,若是反序則交換,直到沒有反序的記錄爲止。數據結構
在最好的狀況下,也就是數列自己是排好序的,須要進行 n - 1 次比較;在最壞的狀況下,也就是數列自己是逆序的,須要進行 n(n-1)/2 次比較。所以冒泡排序總的時間複雜度是 O(n^2)。性能
選擇排序(Selection sort) 的基本思想是每一趟在 n - i + 1 (i = 1,2,***,n - 1)個記錄中選取關鍵字最小(或最大)的記錄做爲有序序列的第 i 個記錄,直到全部元素排序完成。選擇排序是不穩定的排序算法。優化
選擇排序的時間複雜度爲 O(n^2),但性能上略優於冒泡排序。ui
插入排序相似於整理撲克牌,基本操做是將一個記錄插入到已經排好序的有序數列中,從而獲得一個有序但記錄數加一的有序數列。設計
插入排序的時間複雜度爲 O(n^2),是穩定的排序方法,適用於數量較少的排序。視頻
雞尾酒排序是冒泡排序的一種變形。先找到最小的數字,放在第一位,再找到最大的數字放在最後一位。而後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。排序
雞尾酒排序的時間複雜度爲 O(n^2)。io
希爾排序(Shell Sort)是插入排序的一種,是針對直接插入排序算法的改進。基本思想是將相距某個增量 d 的記錄組成一個子序列,經過插入排序使得這個子序列基本有序,而後減小增量繼續排序。
操做上先取一個小於 n 的整數 d1 做爲第一個增量,把所有記錄分紅 d1 個組,全部距離爲 dl 的倍數的記錄放在同一個組中。先在各組內進行直接插人排序,而後取第二個增量d2 < d1 重複上述的分組和排序,直至所取的增量 dt = 1 (dt<dt-l<…<d2<d1),即全部記錄放在同一組中進行直接插入排序爲止。
希爾排序的時間複雜度能夠達到 O(n^(3/2)),要好於前面幾種算法。
梳排序和希爾排序很相似。希爾排序是在直接插入排序的基礎上作的優化,而梳排序是在冒泡排序的基礎上作的優化,也就是將相距某個增量 d 的記錄組成一個子序列,經過冒泡排序使得這個子序列基本有序,而後減小增量繼續排序。
梳排序的時間複雜度是 O(nlogn)。
歸併排序(MERGE-SORT) 是一種分治算法,是創建在歸併操做上的一種有效的排序算法。經常使用的 2 路歸併排序假設初始序列有 n 個記錄,能夠當作是 n 個長度爲 1 的子序列,進行兩兩歸併,能夠獲得 n / 2 個長度爲 2 或 1 的子序列;再兩兩歸併,******,直到獲得一個長度爲 n 的有序序列爲止。
歸併排序的時間複雜度是 O(nlogn),是一種效率高且穩定的算法。
快速排序(Quicksort)是對冒泡排序的一種改進。基本思想是經過一趟排序將待排記錄分割成獨立的兩部分,其中一部分的記錄都比另外一部分小,而後再分別對這兩個部分進行快速排序,最終實現整個序列的排序。
快速排序的時間複雜度爲 O(nlogn),是一種不穩定的排序算法;
堆是具備下列性質的徹底二叉樹:
1. 每一個節點的值都大於或等於其左右孩子節點的值,稱爲大頂堆;
2. 每一個節點的值都小於或等於其左右孩子節點的值,稱爲小頂堆。
堆排序(Heap sort)是指利用堆這種數據結構所設計的一種排序算法。基本思想是把待排序的序列構形成一個大頂堆,此時序列的最大值就是隊頂元素,把該元素放在最後,而後對剩下的 n - 1 個元素繼續構造大頂堆,直到排序完成。
堆排序的時間複雜度爲 O(nlogn),因爲要構造堆,所以不適用於序列個數較少的狀況。