php堆排序实现原理与应用方法


Posted in PHP onJanuary 03, 2015

本文实例讲述了php堆排序实现原理与应用方法。分享给大家供大家参考。具体分析如下:

这里以php作为描述语言较详细讲解堆排序原理,因保证程序可读性,故不做优化,php程序中关于堆的一些概念如下:

假设n为当前数组的key则,n的父节点为 n>>1 或者 n/2(整除);n的左子节点l= n<<1 或 l=n*2,n的右子节点r=(n<<1)+1 或 r=l+1

$arr=array(1,8,7,2,3,4,6,5,9);

数组$arr的原形态结构如下:

             1
           /   
         8      7
       /         /
     2     3      4  6
    /
   5  9
heapsort($arr);print_r($arr);

排序后生成标准的小顶堆结构如下:

             1
           /  
         2      3
       /       / 
     4    5      6   7
    /
   8  9
既数组:array(1,2,3,4,5,6,7,8,9):

function heapsort(&$arr) 

{ 

        //求最后一个元素位 

        $last=count($arr); 

        //堆排序中通常忽略$arr[0] 

        array_unshift($arr,0); 

        //最后一个非叶子节点 

        $i=$last>>1; 

 

        //整理成大顶堆,最大的数整到堆顶,并将最大数和堆尾交换,并在之后的计算中忽略数组后端的最大数(last),直到堆顶(last=堆顶) 

        while(true) 

        { 

                adjustnode($i,$last,$arr); 

                if($i>1) 

                { 

                        //移动节点指针,遍历所有非叶子节点 

                        $i--; 

                } 

                else 

                { 

                        //临界点last=1,既所有排序完成 

                        if($last==1)break; 

                        //当i为1时表示每一次的堆整理都将得到最大数(堆顶,$arr[1]),重复在根节点调整堆 

                        swap($arr[$last],$arr[1]); 

                        //在数组尾部按大小顺序保留最大数,定义临界点last,以免整理堆时重新打乱数组后面已排序好的元素 

                        $last--; 

                } 

        } 

        //弹出第一个数组元素 

        array_shift($arr); 

} 

 

//整理当前树节点($n),临界点$last之后为已排序好的元素 

function adjustnode($n,$last,&$arr) 

{ 

        $l=$n<<1;        //$n的左孩子位 

        if(!isset($arr[$l])||$l>$last) return ; 

        $r=$l+1;        //$n的右孩子位 

 

        //如果右孩子比左孩子大,则让父节点的右孩子比 

        if($r<=$last&&$arr[$r]>$arr[$l]) $l=$r; 

        //如果其中子节点$l比父节点$n大,则与父节点$n交换 

        if($arr[$l]>$arr[$n])                 

        { 

                //子节点($l)的值与父节点($n)的值交换 

                swap($arr[$l],$arr[$n]); 

                //交换后父节点($n)的值($arr[$n])可能还小于原子节点($l)的子节点的值,所以还需对原子节点($l)的子节点进行调整,用递归实现 

                adjustnode($l,$last,$arr); 

        }

} 

 

//交换两个值 

function swap(&$a,&$b) 

{ 

        $a=$a ^ $b;

         $b=$a ^ $b;

         $a=$a ^ $b; 

}

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

PHP 相关文章推荐
example1.php
Oct 09 PHP
PHP中数组的三种排序方法分享
May 07 PHP
Zend Framework框架之Zend_Mail实现发送Email邮件验证功能及解决标题乱码的方法
Mar 21 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
Smarty3配置及入门语法
Feb 22 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
PHP迭代器接口Iterator用法分析
Dec 28 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
Oct 16 PHP
如何在centos8自定义目录安装php7.3
Nov 28 PHP
PHP获取类私有属性的3种方法
Sep 10 PHP
php购物车实现方法
Jan 03 #PHP
PHP实现格式化文件数据大小显示的方法
Jan 03 #PHP
php自定义加密与解密程序实例
Dec 31 #PHP
推荐一本PHP程序猿都应该拜读的书
Dec 31 #PHP
推荐10个提供免费PHP脚本下载的网站
Dec 31 #PHP
php使用google地图应用实例
Dec 31 #PHP
php将文本文件转换csv输出的方法
Dec 31 #PHP
You might like
php下目前为目最全的CURL中文说明
2010/08/01 PHP
PHP 伪静态技术原理以及突破原理实现介绍
2013/07/12 PHP
php视频拍照上传头像功能实现代码分享
2015/10/08 PHP
php生成图片缩略图功能示例
2017/02/22 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
JS JavaScript获取Url参数,src属性参数
2021/03/09 Javascript
跨浏览器的设置innerHTML方法
2006/09/18 Javascript
什么是JavaScript
2009/08/13 Javascript
JS操作图片(增,删,改) 例子
2013/04/17 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(下)
2017/04/21 Javascript
React Native中导航组件react-navigation跨tab路由处理详解
2017/10/31 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
electron + vue项目实现打印小票功能及实现代码
2018/11/25 Javascript
java遇到微信小程序 &quot;支付验证签名失败&quot; 问题解决
2019/12/22 Javascript
Python的高级Git库 Gittle
2014/09/22 Python
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
Python 动态变量名定义与调用方法
2020/02/09 Python
css3圆角边框和边框阴影示例
2014/05/05 HTML / CSS
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
租房合同协议书
2014/04/09 职场文书
热爱祖国演讲稿
2014/05/04 职场文书
小学校长先进事迹材料
2014/05/13 职场文书
2014年冬季防火方案
2014/05/21 职场文书
三严三实对照检查材料思想汇报
2014/09/28 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2014年后勤工作总结范文
2014/12/16 职场文书
授权委托书
2015/01/28 职场文书
2015年教研工作总结
2015/05/23 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
大学军训心得体会800字
2016/01/11 职场文书
Python编解码问题及文本文件处理方法详解
2021/06/20 Python