堆排序是指利用堆這種資料結構所設計的一種排序演算法。堆是乙個近似完全二叉樹的的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或大於)它的父結點。
思路:1、將待排序序列構造成乙個大頂堆
2、此時,整個序列的最大值就是堆頂的根節點
3、將其與末尾元素進行交換,此時末尾就為最大值
4、然後將剩餘n-1個元素重新構造成乙個堆,這樣就會得到n個元素的次小值。如此反覆執行,便能得到乙個有序序列了
注:每個結點的值都大於或等於其左右子結點的值,稱為大頂堆;
每個結點的值都小於或等於其左右子結點的值,稱為小頂堆。
小頂堆(降序)
<?php
//因為是陣列,下標從0開始,所以,下標為n根結點的左子結點為2n+1,右子結點為2n+2;
//初始化值,建立初始堆
$arr=array(49,38,65,97,76,13,27,50);
$arrsize=count($arr);
//將第一次排序抽出來,因為最後一次排序不需要再交換值了。
buildheap($arr,$arrsize);
for($i=$arrsize-1;$i>0;$i--)
print_r($arr);
//用陣列建立最小堆
function buildheap(&$arr,$arrsize)
}//將子結點中較小的和父結點比較,若子結點較小,與父結點交換位置,同時更新較小
if($arr[$min]}}
}//此函式用來交換下陣列$arr中下標為$one和$another的資料
function swap(&$arr,$one,$another)
?>
大頂堆(公升序)
<?php
/*** 將陣列初始化構建堆
* 從最後乙個非葉子節點開始,遞迴到第0個, index = n/2 -1
* */
function buildheap(&$arr)
}/**
* 交換頭尾,在構建堆
* */
function sortheap(&$arr)
//交換頭尾後,按照堆規則,重新構建堆
adjustheap($arr,0,$i);
$k++;}}
/*** 按照堆規則,重新構建堆
* * @param int $parentindex
* @param int $length
*/function adjustheap(&$arr,$parentindex,$length)
if ($arr[$parentindex] >= $arr[$childindex])
$temp = $arr[$parentindex];
$arr[$parentindex] = $arr[$childindex];
$arr[$childindex] = $temp;
$parentindex = $childindex;
$childindex = 2*$parentindex + 1;}}
/***
* 用來做特殊除錯的
* @param int $parentindex
* @param int $length
*/function adjustheap1(&$arr,$parentindex,$length)
if ($arr[$parentindex] >= $arr[$childindex])
$temp = $arr[$parentindex];
$arr[$parentindex] = $arr[$childindex];
$arr[$childindex] = $temp;
$parentindex = $childindex;
$childindex = 2*$parentindex + 1;}}
$arr = [20,50,10,30,70,20,80];
buildheap($arr);
sortheap($arr);
print_r($arr);
?>
排序演算法之堆排序
前言 今天我來介紹下堆排序,在寫堆排序 之前,我們要知道堆的概念!堆的定義 n個關鍵字序列kl,k2,kn稱為 heap 當且僅當該序列滿足如下性質 簡稱為堆性質 1 ki k 2i 且ki k 2i 1 1 i n 當然,這是小根堆,大根堆則換成 號。k i 相當於二叉樹的非葉子結點,k 2i 則...
排序演算法之堆排序
堆排序演算法是選擇排序的一種,該演算法只是通過堆,最大堆 或者最小堆選擇出乙個待排序序列中的最大值,或者最小值。要想實現堆排序演算法,就需要構建什麼堆,這裡也最小堆為例。說明什麼是堆,怎麼構建乙個堆。假設待排序序列為a n 為乙個陣列。陣列的長度為n 陣列下標為 0,1,2,i,2i,2i 1 n ...
排序演算法之堆排序
宣告 本博文 為樓主親自編寫並測試,其它內容引用至我一直很崇拜的牛人morewindows。他對排序演算法的講解通俗易懂,給人一種耳目一新的感覺。堆排序與快速排序 歸併排序 一樣都是時間複雜度為o n logn 的幾種常見排序方法。最小堆的講解以及最小堆元素的插入和刪除參見最小堆操作。以下繼續引用以...