什麼是堆
這裡的堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。
堆可以視為一棵完全的二叉樹,完全二叉樹的乙個「優秀」的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素.
陣列與堆之間的關係
二叉堆一般分為兩種:最大堆和最小堆。
什麼是最大堆
堆中每個父節點的元素值都大於等於其孩子結點(如果存在),這樣的堆就是乙個最大堆
因此,最大堆中的最大元素值出現在根結點(堆頂)
節點與陣列索引關係
對於給定的某個結點的下標i,可以很容易的計算出這個結點的父結點、孩子結點的下標,而且計算公式很漂亮很簡約(以1為開始下標)
php實現**
<?php
/***從$parent位置開始向下調整
*前提,以$parent為根結點的下面的任何一支都應是個最大堆
*/function
adjustnode
(&$arr,$parent)
if(($child != $size) && ($arr[$child] < $arr[$child+1]))
if($arr[$child]>$arr[$parent])
}function
buildmaxheap
(&$arr)
}function
insertheap
(&$arr,$value)
}/**
*為了便於重建堆,實際的操作是將最後乙個資料的值賦給根結點,然後再從根結點開始進行一次從上向下的調整。
*/function
popheap
(&$arr)
function
swap
(&$a,&$b)
?>
堆排序的最壞和最優情況的時間複雜度都是o(nlogn),
但是堆排序並不是穩定排序(排序的穩定性是指如果在排序的序列中,存在前後相同的兩個元素的話,排序前 和排序後他們的相對位置不發生變化)
堆以及堆排序實現
1.今天實現了一下堆排序,這裡的堆是指二叉堆,至於二項堆和斐波那契堆以後再說。先看二叉堆的定義 二叉堆是完全二叉樹或近似完全二叉樹。滿足特性是 父親節點的值大於等於 小於等於 左右孩子的值,並且左右子樹也是二叉堆。對應的二叉堆是大頂堆 小頂堆 二叉堆是完全二叉樹,可以用線性表來儲存。2.實現堆排序時...
堆以及堆排序
二叉 堆 乙個類似完全二叉樹的資料結構 左孩子 2i 右孩子 2i 1 父節點 i 2 以上結論如果記不住,用到時可以自己畫個圖推一下 物理儲存 用陣列儲存a 1,2,3.n 1.調整每個節點的演算法 如果要建立大頂堆,則需遵循每個父親結點的值都要大於左右孩子的值 遞迴版本 param number...
堆以及堆排序詳解
記錄一下自己理解的堆和堆排序吧。堆是一種類似於完全二叉樹的樹形結構,對於二叉樹中所有非葉子節點,如果根節點的值嚴格大於其兩個兒子的值,則稱為 大頂堆,反之稱為小頂堆。堆排序的一般步驟 首先利用已有的資料構造乙個堆,大頂堆增序,小頂堆降序。將堆頂的元素與堆末元素交換,接著重新調整剩下的元素為乙個堆,直...