首页 > 编程知识 正文

归并排序算法详解(堆排序的算法及代码实现)

时间:2023-05-04 06:59:04 阅读:75895 作者:3488

本文主要介绍了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;

}

排序的最终结果如下所示。

相关建议:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。