本文主要介绍了PHP实现的堆排序算法,并结合实例形式分析了PHP堆排序的原理、实现步骤和相关操作技巧,有需要的朋友可以参考
具体如下。
堆是计算机科学中特殊数据结构的总称,通常可以视为树的数组对象。
(k1,k2,ki,…,kn ) ) ki=k2I,ki=k2I,ki=k2i 1),(I=1,2,3,4……n/2 ) ) )
关于堆:
堆中节点的值始终小于或等于父节点的值;
总是把完全二叉树(下面)堆起来。
根节点最大的堆称为最大堆或大堆,根节点最小的堆称为最小堆或小根堆。
二叉树
说到堆积排序,不能提到完全二叉树。 这些基本概念充斥在网上。 我取下了最简单的东西。
二叉树:除最后一层外,各层节点数达到最大值; 最后一层只缺了右边的几个节点。
我想总结一下,正因为有以下两个特征,
1 .仅允许在最后一层有空闲节点,并且空闲节点在右侧。 即,叶节点只出现在层次最大的两个层次中。 (记忆方式规律性);
2 .在i1的情况下,tree的父母为tree[i p 2] (其父子节点值的规则性);
便于排序。
堆栈排序
求升序用大山,求降序用小山。
这个例子用求降序的小山顶的山进行分析。
排序步骤如下:
1、将数据(49、38、65、97、76、13、27和50 )设置为数组$arr。
2、用数组$arr创建小的顶层堆(主要步骤在代码注释中介绍。 下图是用数组创建小顶堆的过程) )。
3、用最后一片叶子换堆根(最小的因素),减少堆长1,跳到第二步;
4、重复步骤2-3直到堆栈中只有一个节点完成排序。
已排序的PHP实现
//数组,所以下标从0开始,所以下标为n根左子节点为2n 1,右子节点为2n 2;
//初始化值,创建初始堆
$ arr=array (49,38,65,97,76,13,27,50 );
$arrsize=count($arr );
//提取第一个排序。 因为最后的排序已经不需要交换值了。
bildheap($arr、$arrSize );
for($I=$arrsize-1; $i0; $i--
swap($arr、$i、0 );
$arrsize----;
bildheap($arr、$arrSize );
}
//用数组创建最小堆
functionbuildheap($arr,$arrSize ) {
//计算第一个下标$index,在如图所示数字' 97 '所在的位置,比较各个子树的父节点和子节点,将最小值存储在父节点中
从$index循环比较一棵树,形成最小堆
for($index=intval ) $arrsize/2 )-1; $index=0; $index-- ) {
//如果有左节点,将其下标存储在最小值$min中
if($index*2 1
$min=$index*2 1;
//如果有右子节点,则比较左右节点的大小,如果右子节点小,则将该节点的下标记录为最小值$min
if($index*2 2
if($arr ) $index*2) ) ) )
$min=$index*2 2;
}
}
//将子节点中较小的节点与父节点进行比较,子节点小时与父节点交换位置,同时更新
if($arr[$min]
swap($arr、$min、$index;
}
}
}
}
//此函数用于交换数组$arr下带$one和$another后缀的数据
功能swap ($ arr、$one、$another ) {
$tmp=$arr[$one];
$arr[$one]=$arr[$another];
$arr[$another]=$tmp;
}
排序的最终结果如下所示。
相关建议: