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 smarty模版引擎中的缓存应用
Dec 02 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
PHP在引号前面添加反斜杠(PHP去除反斜杠)
Sep 28 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
PHP的error_reporting错误级别变量对照表
Jul 08 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
php解析xml方法实例详解
May 12 PHP
mysql desc(DESCRIBE)命令实例讲解
Sep 24 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
laravel框架关于搜索功能的实现
Mar 15 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 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
linux下使用crontab实现定时PHP计划任务失败的原因分析
2014/07/05 PHP
PHP exif扩展方法开启详解
2014/07/28 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
利用谷歌地图API获取点与点的距离的js代码
2012/10/11 Javascript
js有序数组的连接问题
2013/10/01 Javascript
JS判断是否长按某一键的方法
2016/03/02 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
AngularJS入门教程之ng-checked 指令详解
2016/08/01 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
利用angularjs1.4制作的简易滑动门效果
2017/02/28 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
JS合并两个数组的3种方法详解
2019/10/24 Javascript
如何基于原生javaScript生成带图片的二维码
2019/11/21 Javascript
Vue父组件向子组件传值以及data和props的区别详解
2020/03/02 Javascript
JavaScript设计模式之门面模式原理与实现方法分析
2020/03/09 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
python 域名分析工具实现代码
2009/07/15 Python
python写的ARP攻击代码实例
2014/06/04 Python
python 网络编程详解及简单实例
2017/04/25 Python
python爬取Ajax动态加载网页过程解析
2019/09/05 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
python socket 聊天室实例代码详解
2019/11/14 Python
Python @property原理解析和用法实例
2020/02/11 Python
k-means 聚类算法与Python实现代码
2020/06/01 Python
Python类型转换的魔术方法详解
2020/12/23 Python
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
RetroStage德国:复古服装
2019/02/03 全球购物
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
蒂娜商店:Tiina the Store
2019/12/07 全球购物
通用求职信范文模板分享
2013/12/27 职场文书
家长对小学生的评语
2014/01/28 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书