堆排序與歸併排序具有相同的時間複雜度o(nlgn),但是在講堆排序之前,先要搞清楚堆排序使用的「二叉堆」
二叉堆是乙個陣列,可以被看成近似的完全二叉樹
特點:
1.樹上每一節點對應乙個元素,除最底層外,樹是完全充滿的,而且從左到右填充。
2.
a(大頂堆):根節點的值是大於等於任何子節點的值
b(小頂堆):根節點的值是小於等於任何子節點的值
3.每個節點的左子樹和右子樹均為乙個二叉堆
通過以上特點,將乙個陣列的所有元素依次放入二叉堆中,設數的根節點為a[i],給定乙個節點下標為i,則可以得到節點的父節點,左孩子和右孩子的下標:
父節點:i/2
左孩子:2*i
右孩子:2*i+1
介紹完基本知識,書本上介紹了最大堆排序的步驟及時間複雜度:
max-heapify(對於單個二叉堆的排序演算法) 時間複雜度o(lgn)
build-max-heap(建二叉堆演算法) 時間複雜度o(n)
heapsort(對陣列排序) 時間複雜度o(nlgn)
一、max-heapify
這個步驟的目的是維護最大堆性質,輸入為陣列a和下標i,在呼叫max-heapify時,假定左子樹和右子樹均為最大堆,但a[i]可能小於孩子,所以通過讓a[i]逐級下降,使得下標i為根節點的子樹滿足最大堆性質。
**展示:
int maxheapify(int
*a,int i,int
size)
else
if(r<=size&&a[r]>a[largest]) //右孩子與根節點
if(largest!=i)
}}
分析時間代價:
1。調整a[i]和左孩子、右孩子關係θ(1)
2。以i的乙個孩子為根節點的子樹執行max-heapify時間
遞迴式:t(n)=t(2n/3)+θ(1)
遞迴式的解為o(lgn)(主定理方法2),所以樹高為n的結點,max-heapify時間複雜度為o(n)
二、建堆
根節點下標為a.length/2,葉節點下標為(n/2+1)、(n/2+2)…(n),所以對a.length/2到1做max-heapify操作
int buildheap(int *a,int size) }
建堆的時間複雜度在88頁有詳細的介紹,這裡不詳細介紹了,主要的就是建堆的時間複雜度是o(n).
三、堆排序
對大頂堆,因為根節點的值是陣列中也是二叉堆中最大的,所以每次把根節點取走,然後剩下的排出最大根節點再取走,依次就可以完成陣列從大到小排序,反之從小到大排序是在小頂堆中每次取根節點所得。
**:
int heapsort(int
*a,int
size)
}
因為是建堆的時間複雜度是o(n),要呼叫max-heapify(n-1)次,每次時間o(lgn),所以堆排序的時間複雜度是o(nlgn)。 演算法導論 6 堆排序
堆的分類 最大堆性質 高度 對於堆的一些基本操作 偽 描述 實現 max heapify python實現 123 4567 891011 1213 def max heapify i print max heapify i l left i r right i if l heap size and...
演算法複習(1) 堆排序
堆是一種完全二叉樹結構,以陣列儲存 堆的最後一層從左開始填充 對於元素個數為n的堆來說,高度為 floor lgn 對於給定下標i 從0開始 父節點,左兒子,右兒子分別為 parent i return i 1 1 left i return 2i 1 right i return 2i 2堆排序主...
演算法 3 堆排序
堆排序是一種選擇排序,其時間複雜度為o nlogn 堆的定義 n個元素的序列當且僅當滿足下列關係之一時,稱之為堆。情形1 ki k2i 且ki k2i 1 最小化堆或小頂堆 情形2 ki k2i 且ki k2i 1 最大化堆或大頂堆 其中i 1,2,n 2向下取整 若將和此序列對應的一維陣列 即以一...