堆排序(英语:heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素
2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标;parent(i)=floor(i/2) left(i)=2i right=2i+1
3.最大堆和最小堆,最大堆:根结点是最大值,最小堆:根结点是最小值
4.堆排序就是把最大堆堆顶的最大数取出,剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,直到剩余数只有一个结束
5.最大堆调整(维护最大堆,子节点永远小于父结点);创建最大堆(把一个数组调整成最大堆的数组);堆排序(创建最大堆,交换,维护最大堆)
maxheapify (array,index,heapsize) //最大堆调整
imax,ileft,iright
while true
imax=index;ileft=2*index+1;iright=2*index+2
如果根结点小于左右子树里结点值,就交换一下这两个值
利用第三方变量,交换下两个值
buildmaxheap(array) //创建最大堆,把一个数组调整成最大堆的数组
iparent=floor((size-1)/2)
for i=iparent;i>=0;i--
maxheapify (array,i,size)
sort(arr)
buildmaxheap(array, heapsize);//创建最大堆
for (int i = heapsize - 1; i > 0; i--) {
swap(array, 0, i); //交换第一个和最后一个
maxheapify(array, 0, i);//维护最大堆,size小了一个//交换元素
function swap(&$arr,$a,$b){
$temp=$arr[$a];
$arr[$a]=$arr[$b];
$arr[$b]=$temp;
}
//排序的入口函数
function heapsort(&$arr){
$heapsize=count($arr);
buildmaxheap($arr, $heapsize);//创建最大堆
for ($i = $heapsize - 1; $i > 0; $i--) {
swap($arr,0,$i); //交换第一个和最后一个
maxheapify($arr, 0, $i);//维护最大堆,size小了一个
}
}
//创建最大堆的函数
function buildmaxheap(&$arr, $heapsize){
$iparent=floor(($heapsize-1)/2);//根据最后一个元素的索引值计算该结点根结点的索引是哪个
for($i=$iparent;$i>=0;$i--){//这个循环是循环的所有根结点
maxheapify($arr,$i,$heapsize);//维护最大堆
}
}
//维护最大堆
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);
高防云服务器被攻击怎么办不实名域名哪里买WordPress建站用哪个主机好?WordPress主机评测推荐买低配云服务器大概是多少钱阿里云首次购买云服务器3折优惠香港阿里云服务器购买吗网站免费虚拟主机申请阿里云3月采购季服务器划算