上一篇文章提到了快速排序、冒泡排序、直接插入排序、直接選擇排序和希爾排序。這篇文章說堆排序、歸併排序和基數排序。堆排序、快速排序和歸併排序時間複雜度都是O(nlogn)
堆排序
二叉堆的定義
- 二叉堆滿足二個特性:
- 1.父結點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值。
- 2.每個結點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。
- 當父結點的鍵值總是大於或等於任何一個子節點的鍵值時爲最大堆。當父結點的鍵值總是小於或等於任何一個子節點的鍵值時爲最小堆。下圖展示一個最小堆:
堆的存儲結構
由於堆是完全二叉樹,所以堆用數組存儲。
堆排序基本思想
堆排序的基本思想是:將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就爲最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了。
步驟一 構造初始堆。
將給定無序序列構造成一個大頂堆(一般升序採用大頂堆,降序採用小頂堆)。
步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大。
然後繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建、交換
歸併排序
基本思想
歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。
基本過程
基數排序
基本思想
基數排序:通過序列中各個元素的值,對排序的N個元素進行若干趟的“分配”與“收集”來實現排序。
分配:我們將L[i]中的元素取出,首先確定其個位上的數字,根據該數字分配到與之序號相同的桶中
收集:當序列中所有的元素都分配到對應的桶中,再按照順序依次將桶中的元素收集形成新的一個待排序列L[ ]
對新形成的序列L[]重複執行分配和收集元素中的十位、百位...直到分配完該序列中的最高位,則排序結束
基本過程
排序算法總結
參考文獻: