php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法__第1頁(yè)
php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法__第2頁(yè)
php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法__第3頁(yè)
php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法__第4頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法_ 這篇文章主要介紹了php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法,較為具體的分析了堆排序的原理及用法技巧,具有肯定參考借鑒價(jià)值,需要的伴侶可以參考下 本文實(shí)例講解并描述了php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法。分享給大家供大家參考。具體分析如下: 這里以php作為描述語(yǔ)言較具體講解堆排序原理,因保證程序可讀性,故不做優(yōu)化,php程序中關(guān)于堆的一些概念如下: 假設(shè)n為當(dāng)前數(shù)組的key則,n的父節(jié)點(diǎn)為 n1 或者 n/2(整除);n的左子節(jié)點(diǎn)l= n1 或 l=n*2,n的右子節(jié)點(diǎn)r=(n1)+1 或 r=l+1 $arr=array(1,8,7,2,3,4,6,5,9); 數(shù)組$arr

2、的原形態(tài)結(jié)構(gòu)如下: 1 / 8 7 / / 2 3 4 6 / 5 9 heapsort($arr);print_r($arr); 排序后生成標(biāo)準(zhǔn)的小頂堆結(jié)構(gòu)如下: 1 / 2 3 / / 4 5 6 7 / 8 9 既數(shù)組:array(1,2,3,4,5,6,7,8,9): 代碼如下: function heapsort($arr) /求最終一個(gè)元素位 $last=count($arr); /堆排序中通常忽視$arr0 array_unshift($arr,0); /最終一個(gè)非葉子節(jié)點(diǎn) $i=$last1; /整理成大頂堆,最大的數(shù)整到堆頂,并將最大數(shù)和堆尾交換,并在之后的計(jì)算中忽視數(shù)組后端

3、的最大數(shù)(last),直到堆頂(last=堆頂) while(true) adjustnode($i,$last,$arr); if($i1) /移動(dòng)節(jié)點(diǎn)指針,遍歷全部非葉子節(jié)點(diǎn) $i-; else /臨界點(diǎn)last=1,既全部排序完成 if($last=1)break; /當(dāng)i為1時(shí)表示每一次的堆整理都將得到最大數(shù)(堆頂,$arr1),重復(fù)在根節(jié)點(diǎn)調(diào)整堆 swap($arr$last,$arr1); /在數(shù)組尾部按大小挨次保留最大數(shù),定義臨界點(diǎn)last,以免整理堆時(shí)重新打亂數(shù)組后面已排序好的元素 $last-; /彈出第一個(gè)數(shù)組元素 array_shift($arr); /整理當(dāng)前樹節(jié)點(diǎn)($

4、n),臨界點(diǎn)$last之后為已排序好的元素 function adjustnode($n,$last,$arr) $l=$n1; /$n的左孩子位 if(!isset($arr$l)|$l$last) return ; $r=$l+1; /$n的右孩子位 /假如右孩子比左孩子大,則讓父節(jié)點(diǎn)的右孩子比 if($r=$last$arr$r$arr$l) $l=$r; /假如其中子節(jié)點(diǎn)$l比父節(jié)點(diǎn)$n大,則與父節(jié)點(diǎn)$n交換 if($arr$l$arr$n) /子節(jié)點(diǎn)($l)的值與父節(jié)點(diǎn)($n)的值交換 swap($arr$l,$arr$n); /交換后父節(jié)點(diǎn)($n)的值($arr$n)可能還小于原子節(jié)點(diǎn)($l)的子節(jié)點(diǎn)的值,所以還需對(duì)原子節(jié)點(diǎn)($l)的子節(jié)點(diǎn)進(jìn)行調(diào)整,用遞歸實(shí)現(xiàn) adjustnode($l,$last,$arr); /交換兩個(gè)值 function swap($a,$b)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論