php+堆排序算法,排序算法-堆排序-php
什么是堆排序
堆排序是我們經常使用的排序算法,它是利用堆的結構進行排序,堆是一種二叉樹結構,并且它的父節點的值都大于子節點或者都小于子節點,如果大于,就是大頂堆,如果小于就是小頂堆。
根據堆的定義,我們只要不斷構造大頂堆,然后取出堆頂元素就可以完成堆排序。
代碼實現
//?堆排序
function?heapSort(&$arr)
{
//?初始化大頂堆
initHeap($arr);
//?開始交換首尾節點,并每次減少一個末尾節點再調整堆,直到剩下一個元素
for?($end?=?count($arr)?-?1;?$end?>=?0;?$end--)?{
$temp?=?$arr[0];
$arr[0]?=?$arr[$end];
$arr[$end]?=?$temp;
ajustNodes($arr,?0,?$end?-?1);
}
}
//?初始化最大堆,從最后一個非葉子節點開始,最后一個非葉子節點編號為?數組長度/2?向下取整
function?initHeap(&$arr)
{
$len?=?count($arr);
for?($start?=?floor($len?/?2)?-?1;?$start?>?0;?$start--)?{
ajustNodes($arr,?$start,?$len?-?1);
}
}
//?調整節點
//?@param?$arr?待調整數組
//?@param?$start?調整的父節點坐標
//?@param?$end?待調整數組結束節點坐標
function?ajustNodes(&$arr,?$start,?$end)
{
$maxInx?=?$start;
$len?=?$end?+?1;?//?待調整部分長度
$leftChildInx?=?($start?+?1)?*?2?-?1;?//?左孩子坐標
$rightChildInx?=?($start?+?1)?*?2;?//?右孩子坐標
//?如果待調整部分有左孩子
if?($leftChildInx?+?1?
//?獲取最小節點坐標
if?($arr[$maxInx]?
$maxInx?=?$leftChildInx;
}
//?如果待調整部分有右子節點
if?($rightChildInx?+?1?<=?$len)?{
if?($arr[$maxInx]?
$maxInx?=?$rightChildInx;
}
}
}
//?交換父節點和最大節點
if?($start?!=?$maxInx)?{
$temp?=?$arr[$start];
$arr[$start]?=?$arr[$maxInx];
$arr[$maxInx]?=?$temp;
//?如果交換后的子節點還有子節點,繼續調整
if?(($maxInx?+?1)?*?2?<=?$len)?{
ajustNodes($arr,?$maxInx,?$end);
}
}
}
$arr?=?array(1,?5,?3,?7,?9,?10,?2,?8);
heapSort($arr);
print_r($arr);
總結
以上是生活随笔為你收集整理的php+堆排序算法,排序算法-堆排序-php的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php结尾的链接_优化 PHP 代码建议
- 下一篇: php搜索文件名,php实现按文件名搜索