日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php+堆排序算法,排序算法-堆排序-php

發布時間:2025/3/15 php 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。