九種排序算法的可視化及比較

排序是工作和生活中非常常見的一個問題。現在已經有比較成熟的排序技術,被廣泛地應用於各種程序語言或數據庫中。不同的排序算法有不同的性能和適用場景,下面的視頻對比了 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),但性能上略優於冒泡排序。


插入排序

插入排序類似於整理撲克牌,基本操作是將一個記錄插入到已經排好序的有序數列中,從而得到一個有序但記錄數加一的有序數列。

插入排序的時間複雜度爲 O(n^2),是穩定的排序方法,適用於數量較少的排序。


雞尾酒排序

雞尾酒排序是冒泡排序的一種變形。先找到最小的數字,放在第一位,再找到最大的數字放在最後一位。然後再找到第二小的數字放到第二位,再找到第二大的數字放到倒數第二位。以此類推,直到完成排序。

雞尾酒排序的時間複雜度爲 O(n^2)。


希爾排序

希爾排序(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),由於要構造堆,因此不適用於序列個數較少的情況。

原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章