国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

圖文詳解Heap Sort堆排序算法及JavaScript的代碼實現(xiàn)

2019-11-20 10:09:40
字體:
來源:轉載
供稿:網友

1. 不得不說說二叉樹
要了解堆首先得了解一下二叉樹,在計算機科學中,二叉樹是每個節(jié)點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用于實現(xiàn)二叉查找樹和二叉堆。
二叉樹的每個結點至多只有二棵子樹(不存在度大于 2 的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第 i 層至多有 2i - 1 個結點;深度為 k 的二叉樹至多有 2k - 1 個結點;對任何一棵二叉樹 T,如果其終端結點數(shù)為 n0,度為 2 的結點數(shù)為 n2,則n0 = n2 + 1。
樹和二叉樹的三個主要差別:
樹的結點個數(shù)至少為 1,而二叉樹的結點個數(shù)可以為 0
樹中結點的最大度數(shù)沒有限制,而二叉樹結點的最大度數(shù)為 2
樹的結點無左、右之分,而二叉樹的結點有左、右之分
二叉樹又分為完全二叉樹(complete binary tree)和滿二叉樹(full binary tree)
滿二叉樹:一棵深度為 k,且有 2k - 1 個節(jié)點稱之為滿二叉樹

201654180037749.png (325×199)

(深度為 3 的滿二叉樹 full binary tree)
完全二叉樹:深度為 k,有 n 個節(jié)點的二叉樹,當且僅當其每一個節(jié)點都與深度為 k 的滿二叉樹中序號為 1 至 n 的節(jié)點對應時,稱之為完全二叉樹

201654180205013.png (298×198)

(深度為 3 的完全二叉樹 complete binary tree)
2. 什么是堆?
堆(二叉堆)可以視為一棵完全的二叉樹,完全二叉樹的一個“優(yōu)秀”的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用數(shù)組來表示(普通的一般的二叉樹通常用鏈表作為基本容器表示),每一個結點對應數(shù)組中的一個元素。
如下圖,是一個堆和數(shù)組的相互關系

201654180403849.png (564×182)

(堆和數(shù)組的相互關系)
對于給定的某個結點的下標 i,可以很容易的計算出這個結點的父結點、孩子結點的下標:
Parent(i) = floor(i/2),i 的父節(jié)點下標
Left(i) = 2i,i 的左子節(jié)點下標
Right(i) = 2i + 1,i 的右子節(jié)點下標

201654180531505.png (549×172)

二叉堆一般分為兩種:最大堆和最小堆。
最大堆:
最大堆中的最大元素值出現(xiàn)在根結點(堆頂)
堆中每個父節(jié)點的元素值都大于等于其孩子結點(如果存在)

201654180552874.png (373×112)

(最大堆)
最小堆:
最小堆中的最小元素值出現(xiàn)在根結點(堆頂)
堆中每個父節(jié)點的元素值都小于等于其孩子結點(如果存在)

201654180607921.png (370×112)

(最小堆)
3. 堆排序原理
堆排序就是把最大堆堆頂?shù)淖畲髷?shù)取出,將剩余的堆繼續(xù)調整為最大堆,再次將堆頂?shù)淖畲髷?shù)取出,這個過程持續(xù)到剩余數(shù)只有一個時結束。在堆中定義以下幾種操作:
最大堆調整(Max-Heapify):將堆的末端子節(jié)點作調整,使得子節(jié)點永遠小于父節(jié)點
創(chuàng)建最大堆(Build-Max-Heap):將堆所有數(shù)據(jù)重新排序,使其成為最大堆
堆排序(Heap-Sort):移除位在第一個數(shù)據(jù)的根節(jié)點,并做最大堆調整的遞歸運算
繼續(xù)進行下面的討論前,需要注意的一個問題是:數(shù)組都是 Zero-Based,這就意味著我們的堆數(shù)據(jù)結構模型要發(fā)生改變

201654180627211.png (562×194)

(Zero-Based)
相應的,幾個計算公式也要作出相應調整:
Parent(i) = floor((i-1)/2),i 的父節(jié)點下標
Left(i) = 2i + 1,i 的左子節(jié)點下標
Right(i) = 2(i + 1),i 的右子節(jié)點下標
最大堆調整(MAX

主站蜘蛛池模板: 汾西县| 基隆市| 紫阳县| 宁蒗| 林西县| 梁平县| 盐亭县| 淮北市| 锡林浩特市| 海南省| 香河县| 牡丹江市| 饶平县| 醴陵市| 沈丘县| 长泰县| 金乡县| 腾冲县| 黄大仙区| 罗定市| 时尚| 龙海市| 三亚市| 水城县| 宜兰县| 湟源县| 涞水县| 保德县| 南阳市| 崇明县| 遂平县| 昌乐县| 响水县| 麻江县| 周至县| 西乌| 都江堰市| 通榆县| 博乐市| 高淳县| 舒兰市|