gpt4 book ai didi

PHP实现的堆排序算法详解

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 32 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章PHP实现的堆排序算法详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文实例讲述了php实现的堆排序算法。分享给大家供大家参考,具体如下:

经验 。

工作了,面试我工作这家公司时被技术面打击得不行,因为自己的数据结构等基础学得实在太差,虽然原来是想做设计师的说。。。不过看在php写得还凑合的份上能来实习了,但还是决心恶补一下基础。 其实自己之前也确实感觉到了基础的重要性,一些比较深的东西都比较底层,不学好根本没法进行。像我之前用php做websocket,就牵扯到数据包、数据帧等概念,搞不清楚,连数据都没法处理,还得后来补。所以我准备重新学一下数据结构,算法,网络等基础知识,也在此跟大家提个醒,别像我一样走反了方向,甚至到明白过来就已经晚了.

今天来说一下被问到的堆排序的问题,当时被问到时,连完全二叉树的概念都忘了。不过幸好我还有一点点数据结构基础,看了点资料也有些明白了,所以想用php写一下二叉树的堆排序,顺便也复习下二叉树,堆等数据结构.

堆 。

堆(heap)是计算机科学中一类特殊的数据结构的统称,通常是一个可以被看做一棵树的数组对象.

堆{k1,k2,ki,…,kn} (ki <= k2i,ki <= k2i+1)|(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2) 。

关于堆:

堆中某个节点的值总是不大于或不小于其父节点的值; 堆总是一棵完全二叉树(下面)。 将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆.

完全二叉树 。

说到堆排序,就不能不提完全二叉树,这些基本概念在网上到处都是,我摘了个最简单的。.

完全二叉树:除最后一层外,每一层上的节点数均达到最大值;在最后一层上只缺少右边的若干结点.

我自己总结认为,正是因为有下面两个特点, 。

1. 只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现(存储方式的规则性); 2. 若i>1,tree的双亲为tree[i div 2](其父子结点值的规律性); 。

才使得其进行排序非常方便.

堆排序 。

堆排序求升序用大顶堆,求降序用小顶堆.

本例用求降序的小顶堆来解析.

堆排序步骤如下:

1、我们将数据(49、38、65、97、76、13、27、50)建立一个数组$arr; 2、用数组$arr建立一个小顶堆(主要步骤,会在代码注释里解释,下图是用一个数组建立小顶堆的过程); 3、将堆的根(最小的元素)与最后一个叶子交换,并将堆长度减一,跳到第二步; 4、重复2-3步,直到堆中只有一个结点,排序完成.

PHP实现的堆排序算法详解

堆排序的php实现 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//因为是数组,下标从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 --){
   swap( $arr , $i ,0);
   $arrsize --;
   buildheap( $arr , $arrsize );
}
//用数组建立最小堆
function buildheap(& $arr , $arrsize ){
   //计算出最开始的下标$index,如图,为数字"97"所在位置,比较每一个子树的父结点和子结点,将最小值存入父结点中
   //从$index处对一个树进行循环比较,形成最小堆
   for ( $index = intval ( $arrsize /2)-1; $index >=0; $index --){
     //如果有左节点,将其下标存进最小值$min
     if ( $index *2+1< $arrsize ){
       $min = $index *2+1;
       //如果有右子结点,比较左右结点的大小,如果右子结点更小,将其结点的下标记录进最小值$min
       if ( $index *2+2< $arrsize ){
         if ( $arr [ $index *2+2]< $arr [ $min ]){
           $min = $index *2+2;
         }
       }
       //将子结点中较小的和父结点比较,若子结点较小,与父结点交换位置,同时更新较小
       if ( $arr [ $min ]< $arr [ $index ]){
         swap( $arr , $min , $index );
       }
     }
   }
}
//此函数用来交换下数组$arr中下标为$one和$another的数据
function swap(& $arr , $one , $another ){
   $tmp = $arr [ $one ];
   $arr [ $one ]= $arr [ $another ];
   $arr [ $another ]= $tmp ;
}

下面是排序的最终结果:

PHP实现的堆排序算法详解

希望本文所述对大家php程序设计有所帮助.

原文链接:http://www.cnblogs.com/zhenbianshu/p/5273995.html 。

最后此篇关于PHP实现的堆排序算法详解的文章就讲到这里了,如果你想了解更多关于PHP实现的堆排序算法详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com