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 相关文章推荐
第三章 php操作符与控制结构代码
Dec 30 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
Aug 09 PHP
php中使用PHPExcel读写excel(xls)文件的方法
Sep 15 PHP
PHP中捕获超时事件的方法实例
Feb 12 PHP
Zend Framework教程之分发器Zend_Controller_Dispatcher用法详解
Mar 07 PHP
php实现无限级分类查询(递归、非递归)
Mar 10 PHP
初识PHP中的Swoole
Apr 05 PHP
Zend Framework上传文件重命名的实现方法
Nov 25 PHP
基于ThinkPHP5.0实现图片上传插件
Sep 25 PHP
php实现微信模板消息推送
Mar 30 PHP
php中如何执行linux命令详解
Nov 06 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 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
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
3种方法轻松处理php开发中emoji表情的问题
2016/07/18 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
js实现鼠标经过时图片滚动停止的方法
2015/02/16 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
2016/04/01 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
基于JS如何实现类似QQ好友头像hover时显示资料卡的效果(推荐)
2016/06/09 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
Js 获取、判断浏览器版本信息的简单方法
2016/08/08 Javascript
微信开发之微信jssdk录音功能开发示例
2018/10/22 Javascript
解决axios会发送两次请求,有个OPTIONS请求的问题
2018/10/25 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
小程序中英文混合排序问题解决
2019/08/02 Javascript
NodeJs crypto加密制作token的实现代码
2019/11/15 NodeJs
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python中基础的socket编程实战攻略
2016/06/01 Python
python sys,os,time模块的使用(包括时间格式的各种转换)
2018/04/27 Python
详解Django的CSRF认证实现
2018/10/09 Python
python中import与from方法总结(推荐)
2019/03/21 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
Python的对象传递与Copy函数使用详解
2019/12/26 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
python 中 .py文件 转 .pyd文件的操作
2021/03/04 Python
Web前端绘制0.5像素的几种方法
2017/08/11 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
英国和爱尔兰最大的地毯零售商:Kukoon
2018/12/17 全球购物
婚庆司仪主持词
2014/03/15 职场文书
小学领导班子对照材料
2014/08/23 职场文书
解除劳动合同协议书
2014/09/17 职场文书
如何通过一篇文章了解Python中的生成器
2022/04/02 Python