[數據結構] 內排序(2)

上一篇文章提到了快速排序、冒泡排序、直接插入排序、直接選擇排序和希爾排序。這篇文章說堆排序、歸併排序和基數排序。堆排序、快速排序和歸併排序時間複雜度都是O(nlogn)

堆排序

二叉堆的定義

  • 二叉堆滿足二個特性:
  • 1.父結點的鍵值總是大於或等於(小於或等於)任何一個子節點的鍵值。
  • 2.每個結點的左子樹和右子樹都是一個二叉堆(都是最大堆或最小堆)。
  • 當父結點的鍵值總是大於或等於任何一個子節點的鍵值時爲最大堆。當父結點的鍵值總是小於或等於任何一個子節點的鍵值時爲最小堆。下圖展示一個最小堆:

堆的存儲結構

由於堆是完全二叉樹,所以堆用數組存儲。

堆排序基本思想

堆排序的基本思想是:將待排序序列構造成一個大頂堆,此時,整個序列的最大值就是堆頂的根節點。將其與末尾元素進行交換,此時末尾就爲最大值。然後將剩餘n-1個元素重新構造成一個堆,這樣會得到n個元素的次小值。如此反覆執行,便能得到一個有序序列了。

步驟一 構造初始堆。

將給定無序序列構造成一個大頂堆(一般升序採用大頂堆,降序採用小頂堆)。

步驟二 將堆頂元素與末尾元素進行交換,使末尾元素最大。

然後繼續調整堆,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建、交換

歸併排序

基本思想

歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該算法採用經典的分治(divide-and-conquer)策略(分治法將問題(divide)成一些小的問題然後遞歸求解,而治(conquer)的階段則將分的階段得到的各答案"修補"在一起,即分而治之)。

基本過程

基數排序

基本思想

基數排序:通過序列中各個元素的值,對排序的N個元素進行若干趟的“分配”與“收集”來實現排序。
分配:我們將L[i]中的元素取出,首先確定其個位上的數字,根據該數字分配到與之序號相同的桶中
收集:當序列中所有的元素都分配到對應的桶中,再按照順序依次將桶中的元素收集形成新的一個待排序列L[ ]
對新形成的序列L[]重複執行分配和收集元素中的十位、百位...直到分配完該序列中的最高位,則排序結束

基本過程

排序算法總結

參考文獻:

https://www.cnblogs.com/chengxiao/p/6129630.html

https://www.jianshu.com/p/7d037c332a9d

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