国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

【PHP】堆排序的原理以及實現代碼

2024-05-04 21:51:01
字體:
來源:轉載
供稿:網友

本篇文章的主要內容是用PHP實現堆排序,具有一定的參考價值,感興趣的朋友可以了解一下。

1.堆(二叉堆):可以視為一棵完全的二叉樹,除了最底層之外,每一層都是滿的,這使得堆可以利用數組來表示,每一個結點對應數組中的一個元素

2.給出某個結點的下標,可以計算出父結點的和孩子結點的下標; parent(i)=floor(i/2) left(i)=2i right=2i+1

3.最大堆和最小堆,最大堆:根結點是最大值,最小堆:根結點是最小值

4.堆排序就是把最大堆堆頂的最大數取出,剩余的堆繼續調整為最大堆,再次將堆頂的最大數取出,直到剩余數只有一個結束

5.最大堆調整(維護最大堆,子節點永遠小于父結點) ;創建最大堆(把一個數組調整成最大堆的數組);堆排序(創建最大堆,交換,維護最大堆)

  1. maxHeapify (array,index,heapSize) //最大堆調整 
  2.  
  3.     iMax,iLeft,iRight 
  4.  
  5.     while true 
  6.  
  7.         iMax=index;iLeft=2*index+1;iRight=2*index+2 
  8.  
  9.         如果根結點小于左右子樹里結點值,就交換一下這兩個值 
  10.  
  11.         利用第三方變量,交換下兩個值 
  12.  
  13. buildMaxHeap(array//創建最大堆,把一個數組調整成最大堆的數組 
  14.  
  15.     iParent=floor((size-1)/2) 
  16.  
  17.     for i=iParent;i>=0;i-- 
  18.  
  19.         maxHeapify (array,i,size) 
  20.  
  21. sort(arr) 
  22.  
  23.     buildMaxHeap(array, heapSize);//創建最大堆 
  24.  
  25.     for (int i = heapSize - 1; i > 0; i--) { 
  26.  
  27.         swap(array, 0, i); //交換第一個和最后一個 
  28.  
  29.          maxHeapify(array, 0, i);//維護最大堆,size小了一個  
  30.  
  31. //交換元素 
  32.  
  33. function swap(&$arr,$a,$b){ 
  34.  
  35.         $temp=$arr[$a]; 
  36.  
  37.         $arr[$a]=$arr[$b]; 
  38.  
  39.         $arr[$b]=$temp
  40.  
  41.  
  42. //排序的入口函數 
  43.  
  44. function heapSort(&$arr){ 
  45.  
  46.         $heapSize=count($arr); 
  47.  
  48.         buildMaxHeap($arr$heapSize);//創建最大堆 
  49.  
  50.         for ($i = $heapSize - 1; $i > 0; $i--) { 
  51.  
  52.                 swap($arr,0,$i); //交換第一個和最后一個 
  53.  
  54.                 maxHeapify($arr, 0, $i);//維護最大堆,size小了一個 
  55.  
  56.         }    
  57.  
  58.  
  59. //創建最大堆的函數 
  60.  
  61. function buildMaxHeap(&$arr$heapSize){ 
  62.  
  63.         $iParent=floor(($heapSize-1)/2);//根據最后一個元素的索引值計算該結點根結點的索引是哪個 
  64.  
  65.         for($i=$iParent;$i>=0;$i--){//這個循環是循環的所有根結點 
  66.  
  67.                 maxHeapify($arr,$i,$heapSize);//維護最大堆 
  68.  
  69.         }    
  70.  
  71.  
  72. //維護最大堆 
  73.  
  74. function maxHeapify(&$arr,$index,$heapSize){ 
  75.  
  76.         $iMax=0;$iLeft=0;$iRight=0; 
  77.  
  78.         while(true){ 
  79.  
  80.                 $iMax=$index
  81.  
  82.                 $iLeft=2*$iMax+1; 
  83.  
  84.                 $iRight=2*$iMax+2; 
  85.  
  86.                 if($iLeft<$heapSize && $arr[$iLeft]>$arr[$iMax]){ 
  87.  
  88.                         $iMax=$iLeft
  89.  
  90.                 }    
  91.  
  92.                 if($iRight<$heapSize && $arr[$iRight]>$arr[$iMax]){ 
  93.  
  94.                         $iMax=$iRight
  95.  
  96.                 }    
  97.  
  98.                 if($iMax!=$index){ 
  99.  
  100.                         swap($arr,$index,$iMax); 
  101.  
  102.                         $index=$iMax
  103.  
  104.                 }else
  105.  
  106.                         break
  107.  
  108.                 }    
  109.  
  110.         }    
  111.  
  112.  
  113. $arr=array(2,1,3,5,9,6); 
  114.  
  115. heapSort($arr); 
  116.  
  117. var_dump($arr); 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉林市| 樟树市| 耿马| 瑞丽市| 庄河市| 昔阳县| 垦利县| 吉木萨尔县| 大渡口区| 商都县| 清流县| 招远市| 太仆寺旗| 汉沽区| 东丽区| 施甸县| 宝应县| 沛县| 项城市| 嫩江县| 湖口县| 怀集县| 荔浦县| 榆林市| 黑水县| 康平县| 抚宁县| 大悟县| 沾益县| 平原县| 札达县| 陈巴尔虎旗| 铁岭市| 高阳县| 连山| 鲁甸县| 兴隆县| 修水县| 蒙阴县| 商都县| 芮城县|