首先了解一下什麼是堆排序?
堆排序(英語:heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的結構,並同時滿足堆的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。其複雜度為0(nlogn),有兩種形式:
大頂堆:
小頂堆:
如圖所示,大頂堆的父節點要比其左右兩個子節點的值都要大;同理,小頂堆的父節點要比其左右兩個子節點的值都要小。
不論是大頂堆還是小頂堆,其左右(孩子)節點都是2i+1(左)、2i+2(右),其中i表示父節點的下標。
演算法思路:
將無序陣列進行堆化,構建小頂堆或大頂堆(一般公升序採用大頂堆,降序採用小頂堆)。從第乙個非葉子節點開始(葉結點自然不用調整,第乙個非葉子結點 n/2-1,n是陣列長度)分別比較該父節點的左右節點,若該父節點小於子節點則進行交換,交換後的子節點數值發生變化可能會不滿足堆的性質,需重新調整二叉樹的結構
初始堆完成以後,將根節點與最後乙個節點交換(以大頂堆為例)交換後,此時最後乙個元素為最大的值,不滿足大頂堆的性質,對其進行向下調整,重新調整為大頂堆的形式,再將堆頂元素與末尾元素交換,得到第二大元素。如此反覆進行交換、重建、交換。
簡單來說就三個步驟:
static
void
sort
(int
nums)
}static
void
swap
(int
nums,
int p,
int r)
若將陣列化為大頂堆:(公升序)
static
void
maxheap
(int
nums)
}static
void
maxheapfixeddown
(int
nums,
int i,
int n)
int max=left;
if(right>=n)
else
if(nums[left]
<=nums[right])if
(nums[i]
>=nums[max]
)return
;//否則將兩個孩子中最大的與父元素交換
swap
(nums,i,max)
;//重新調整二叉樹的順序,變成大頂堆(順序)
maxheapfixeddown
(nums,max,n)
;}
若將陣列化為小頂堆:(降序)
static
void
minheap
(int
nums)
}static
void
minheapfixeddown
(int
nums,
int i,
int n)
int min=left;
if(right>=n)
else
if(nums[left]
>=nums[right])if
(nums[i]
<=nums[min]
)return
;//否則將兩個孩子中最小的與父元素交換
swap
(nums,i,min)
;//min的位置發生改變,重新調整二叉樹的順序,變成小頂堆(逆序)
minheapfixeddown
(nums,min,n)
;}
演算法 排序演算法之堆排序
package sortarith 堆排序 構建最大堆,堆頂即為最大元素,每次取出最大元素後,再重新構建堆,這樣再拿出次大值,迴圈往返 注意 構建堆時需要調整每個非葉子節點,確定其為子堆的最大值 而調整堆時,只需要調整堆頂元素 特例1 若所給待排序陣列array本身已是最大堆型別,可不進行構建堆,即...
演算法 排序演算法之堆排序
堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。堆排序可以說是一種利用堆的概念來排序的選擇排序。分為兩種方法 大頂堆 每個節點的值都大於或等於其子節點的值,在堆排序演算法...
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...