演算法之堆排序

2021-10-04 12:12:17 字數 1898 閱讀 1599

首先了解一下什麼是堆排序?

堆排序(英語: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 則...