PHP堆排序原理及应用方法
下面是用PHP作为描述语言的堆排序原则的更详细的解释。由于程序的可读性,没有进行优化,PHP程序中关于堆的一些概念如下:
假设n是当前数组的关键,母的N是N>>1或n / 2(分);左子节点为N = N << 1或L = N×2,和N的右子节点是r(n<<1)。
$ ARR =阵列(1,8,7,2,3,4,6,5,9);
该数组ARR原配置如下:
一
/
八十七
二千三百四十六
/
五十九
堆排序($ ARR);print_r($ ARR);
排序后生成标准的小顶堆结构如下:
一
/
二十三
四千五百六十七
/
八十九
数组:数组(1,2,3,4,5,6,7,8,9):
复制代码如下:功能排序($ ARR)
{
对于一个最后元/
美元上=计数($ ARR);
/ /堆排序是忽视美元的ARR { 0 }
array_unshift($ ARR,0);
/最后一个非叶节点
$ $ =最后$ > 1;
组织成大的堆顶,最大数量的堆顶,和最大数和桩尾交换,并计算在忽略数组的最大数(最后),直到桩底(最后=桩)。
虽然(真实)
{
Adjustnode(合我,最后美元美元,ARR);
如果($ 1)
{
移动节点指针遍历所有非叶节点
一美元—;
}
其他的
{
/临界点最后= 1,所有排序
如果($ = 1)中断;
/ /当我1每次堆栈将最大数量的整理说(栈顶,$ ARR { 1 }),在根节点反复调整堆
互换(ARR {一}美元美元美元,ARR { 1 });
在数组的结尾按大小保留最大数,定义最后一个临界点,以避免堆后打乱好数组元素的后面排列。
最后一美元--;
}
}
第一个数组元素
array_shift($ ARR);
}
完成当前树节点($ n),在临界点最后一个元素的顺序很好。
功能adjustnode(N亿美元,美元,美元,ARR)
{
$ l = n <<1;左子$
如果(!isset($ ARR { $ L })|美元美元| L >最后)返回;
$ = $ l + 1;右边的子项为
如果孩子比孩子左到右,那么让正确的子节点比父节点
如果($r$ ARR { $ L })$ = $ r;
如果中子l / L l节点比父节点$ n,那么与父节点交换$ n
如果($ ARR { $ L } > { } ARR美元美元)
{
子节点($ l)和交换的父节点(n)值的值。
互换($ ARR { $ L },{ } ARR美元美元);
交换/父节点(N)值($ ARR { $ n })可能小于原子节点($ L)节点的值,所以需要原子节点($ L)节点调整使用递归
Adjustnode(l美元美元美元,去年,ARR);
}
}
两个/交换值
函数交换($ A,b)
{
$ =;
美元=;
$ =;
}
希望本文能对大家的PHP程序设计有所帮助。