堆排序的實現

2021-10-01 13:57:48 字數 1385 閱讀 6087

堆分為大頂堆和小頂堆

大(小)頂堆定義:取任意乙個有兒子的節點,它的值比其左右兒子的值都大(小),滿足這樣條件的完全二叉樹為堆。

注:以下都以大頂堆為例來說堆排序,小頂堆同理。

堆排序很充分的運用完全二叉樹的特性:

堆排序分為兩步:

構建乙個大(小)頂堆;

通過交換堆尾部元素與堆頂元素,每次迴圈輸出堆頂元素即可;

舉例說明給定一組資料如何進行堆排序

[50,10,90,30,70,40,80,60,20]:

圖中步驟1為構建乙個大頂堆過程,圖中步驟2為交換堆尾部元素與堆頂元素,依次輸出結果,樹中淺色筆標註的為陣列下標,深色筆標註的為節點值;

步驟1:找到這顆完全二叉樹中所有 有兒子的節點 ,比較其與兒子節點的大小關係,如果比兒子節點小,與兒子節點中較大的乙個交換;反之,保持不動;

步驟2:,每輪迴圈,通過 將堆尾元素與堆頂元素交換位置 的方式輸出堆頂元素,交換的同時破壞了堆結構,再調整二叉樹為堆結構 ;

如果第2部分的內容你已經詳讀,並且親自計算過,那麼不難發現,堆排序可以分成三個模組函式:

主流程控制函式heapsort、交換元素swap、堆的調整函式heapadjust

具體**如下:

function heapsort(arr) 

console.log('堆的構建', arr)

// 按順序輸出節點

for (i = (arr.length - 1); i>=0; i--)

}function swap(arr, indexfirst, indexnext)

function heapadjust(arr, start, max)

// 如果父親已經是最大的,不動

if (temp >= arr[j])

// 交換父親和較大孩子節點

swap(arr, start, j)

start = j

} arr[start] = temp

}var arr = [50, 10, 90, 30,70, 40, 80, 60, 20]

heapsort(arr)

console.log(arr)

堆排序相對於 冒泡、選擇排序、插入排序 這些複雜度為o(n^2)的來講,其複雜度為o(nlogn)

平衡二叉樹在構建方面是相比堆來講是 嚴格的、消耗空間的,平衡二叉樹是對一組可能隨時會有插入和刪除操作的資料保持其大小順序的一種資料結構;

如果用平衡二叉樹來對一組固定陣列來進行排序,其複雜度還不如冒泡、插入和選擇排序;

堆排序的實現

堆排序是利用了一種資料結構叫做二叉堆,二叉堆是這樣定義的 二叉堆是一種特殊的堆,二叉堆是完全二元樹或者是近似完全二元樹,有最小堆和最大堆 特點 1 父結點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值。2 每個結點的左子樹和右子樹都是乙個二叉堆 都是最大堆或最小堆 利用堆排序資料的儲存方式如...

堆排序的實現

file binaryheap.hpp brief 二叉堆 author xiao2 joyjj0218 qq.com version 1.0 date 2015.11.17 ifndef binaryheap hpp define binaryheap hpp include include us...

堆排序的實現

要想用堆來實現排序,首先得構建乙個堆。將字串 sortexample 放入起始下標為1的陣列中,構成一顆二叉樹 構造堆時,從最後乙個非葉子節點出發。如上圖所示,最後乙個非葉子節點下標為n 2 5,可以觀察出任意乙個大小為n的二叉堆的最後乙個非葉子節點的標號都是n 2。從5開始一直到根節點1,一直進行...