九種排序演算法的視覺化及比較
氣泡排序(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
希爾排序的時間複雜度可以達到 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),由於要構造堆,因此不適用於序列個數較少的情況。
排序演算法小結
1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...
排序演算法小結
1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...
排序演算法小結
演算法過程 假設乙個無序的序列,該演算法將其分成兩部分,前一部分已經完成排序 有序,一開始時只有乙個元素 後一部分任然無序,將後面序列選擇第乙個插入到前面的有序序列,如此直到所有完全有序。複雜度 最簡單的即為,整個序列原來即有序,按照一種最 省事 的方式,我們僅需比較n 1次即可。最複雜的情況,應該...