堆以及php實現堆排序

2021-07-31 22:49:03 字數 1193 閱讀 2228

什麼是堆

這裡的堆(二叉堆),指得不是堆疊的那個堆,而是一種資料結構。

堆可以視為一棵完全的二叉樹,完全二叉樹的乙個「優秀」的性質是,除了最底層之外,每一層都是滿的,這使得堆可以利用陣列來表示,每乙個結點對應陣列中的乙個元素.

陣列與堆之間的關係

二叉堆一般分為兩種:最大堆和最小堆。

什麼是最大堆

堆中每個父節點的元素值都大於等於其孩子結點(如果存在),這樣的堆就是乙個最大堆

因此,最大堆中的最大元素值出現在根結點(堆頂)

節點與陣列索引關係

對於給定的某個結點的下標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...

堆以及堆排序詳解

記錄一下自己理解的堆和堆排序吧。堆是一種類似於完全二叉樹的樹形結構,對於二叉樹中所有非葉子節點,如果根節點的值嚴格大於其兩個兒子的值,則稱為 大頂堆,反之稱為小頂堆。堆排序的一般步驟 首先利用已有的資料構造乙個堆,大頂堆增序,小頂堆降序。將堆頂的元素與堆末元素交換,接著重新調整剩下的元素為乙個堆,直...