小編給大家分享一下PHP中堆排序的原理是什么,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

1.堆(二叉堆):可以視為一棵完全的二叉樹(shù),除了最底層之外,每一層都是滿(mǎn)的,這使得堆可以利用數(shù)組來(lái)表示,每一個(gè)結(jié)點(diǎn)對(duì)應(yīng)數(shù)組中的一個(gè)元素
2.給出某個(gè)結(jié)點(diǎn)的下標(biāo),可以計(jì)算出父結(jié)點(diǎn)的和孩子結(jié)點(diǎn)的下標(biāo); parent(i)=floor(i/2) left(i)=2i right=2i+1
3.大堆和最小堆,大堆:根結(jié)點(diǎn)是大值,最小堆:根結(jié)點(diǎn)是最小值
4.堆排序就是把大堆堆頂?shù)拇髷?shù)取出,剩余的堆繼續(xù)調(diào)整為大堆,再次將堆頂?shù)拇髷?shù)取出,直到剩余數(shù)只有一個(gè)結(jié)束
5.大堆調(diào)整(維護(hù)大堆,子節(jié)點(diǎn)永遠(yuǎn)小于父結(jié)點(diǎn)) ;創(chuàng)建大堆(把一個(gè)數(shù)組調(diào)整成大堆的數(shù)組);堆排序(創(chuàng)建大堆,交換,維護(hù)大堆)
maxHeapify (array,index,heapSize) //大堆調(diào)整
iMax,iLeft,iRight
while true
iMax=index;iLeft=2*index+1;iRight=2*index+2
如果根結(jié)點(diǎn)小于左右子樹(shù)里結(jié)點(diǎn)值,就交換一下這兩個(gè)值
利用第三方變量,交換下兩個(gè)值
buildMaxHeap(array) //創(chuàng)建大堆,把一個(gè)數(shù)組調(diào)整成大堆的數(shù)組
iParent=floor((size-1)/2)
for i=iParent;i>=0;i--
maxHeapify (array,i,size)
sort(arr)
buildMaxHeap(array, heapSize);//創(chuàng)建大堆
for (int i = heapSize - 1; i > 0; i--) {
swap(array, 0, i); //交換第一個(gè)和最后一個(gè)
maxHeapify(array, 0, i);//維護(hù)大堆,size小了一個(gè)//交換元素
function swap(&$arr,$a,$b){
$temp=$arr[$a];
$arr[$a]=$arr[$b];
$arr[$b]=$temp;
}
//排序的入口函數(shù)
function heapSort(&$arr){
$heapSize=count($arr);
buildMaxHeap($arr, $heapSize);//創(chuàng)建大堆
for ($i = $heapSize - 1; $i > 0; $i--) {
swap($arr,0,$i); //交換第一個(gè)和最后一個(gè)
maxHeapify($arr, 0, $i);//維護(hù)大堆,size小了一個(gè)
}
}
//創(chuàng)建大堆的函數(shù)
function buildMaxHeap(&$arr, $heapSize){
$iParent=floor(($heapSize-1)/2);//根據(jù)最后一個(gè)元素的索引值計(jì)算該結(jié)點(diǎn)根結(jié)點(diǎn)的索引是哪個(gè)
for($i=$iParent;$i>=0;$i--){//這個(gè)循環(huán)是循環(huán)的所有根結(jié)點(diǎn)
maxHeapify($arr,$i,$heapSize);//維護(hù)大堆
}
}
//維護(hù)大堆
function maxHeapify(&$arr,$index,$heapSize){
$iMax=0;$iLeft=0;$iRight=0;
while(true){
$iMax=$index;
$iLeft=2*$iMax+1;
$iRight=2*$iMax+2;
if($iLeft<$heapSize && $arr[$iLeft]>$arr[$iMax]){
$iMax=$iLeft;
}
if($iRight<$heapSize && $arr[$iRight]>$arr[$iMax]){
$iMax=$iRight;
}
if($iMax!=$index){
swap($arr,$index,$iMax);
$index=$iMax;
}else{
break;
}
}
}
$arr=array(2,1,3,5,9,6);
heapSort($arr);
var_dump($arr);看完了這篇文章,相信你對(duì)PHP中堆排序的原理是什么有了一定的了解,想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計(jì)公司行業(yè)資訊頻道,感謝各位的閱讀!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
新聞標(biāo)題:PHP中堆排序的原理是什么-創(chuàng)新互聯(lián)
文章轉(zhuǎn)載:http://chinadenli.net/article12/dijdgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、用戶(hù)體驗(yàn)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站制作、關(guān)鍵詞優(yōu)化、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容