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 Cookie的一个使用注意点
Nov 08 PHP
PHP sprintf()函数用例解析
May 18 PHP
php 文章调用类代码
Aug 11 PHP
header导出Excel应用示例
Jan 24 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
PHP中的魔术方法总结和使用实例
May 11 PHP
php正则表达式学习笔记
Nov 13 PHP
通过PHP自带的服务器来查看正则匹配结果的方法
Dec 24 PHP
深入解析PHP的Yii框架中的event事件机制
Mar 17 PHP
php while循环控制的简单实例
May 30 PHP
thinkPHP框架实现的短信接口验证码功能示例
Jun 20 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
多重?l件?合查?(一)
2006/10/09 PHP
dedecms模板标签代码官方参考
2007/03/17 PHP
php session处理的定制
2009/03/16 PHP
php一句话cmdshell新型 (非一句话木马)
2009/04/18 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
建立良好体验度的Web注册系统ajax
2007/07/09 Javascript
JavaScript call apply使用 JavaScript对象的方法绑定到DOM事件后this指向问题
2011/09/28 Javascript
ASP.NET jQuery 实例3 (在TextBox里面阻止复制、剪切和粘贴事件)
2012/01/13 Javascript
JS操作iframe里的dom(实例讲解)
2014/01/29 Javascript
JavaScript数组常用方法
2015/03/02 Javascript
jQuery on()方法绑定动态元素的点击事件无响应的解决办法
2016/07/07 Javascript
javascript 判断当前浏览器版本并判断ie版本
2017/02/17 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
Node.js引入UIBootstrap的方法示例
2018/05/11 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
Vue axios获取token临时令牌封装案例
2020/09/11 Javascript
nodejs+express最简易的连接数据库的方法
2020/12/23 NodeJs
wxpython 学习笔记 第一天
2009/02/09 Python
解决Python print输出不换行没空格的问题
2018/11/14 Python
使用python serial 获取所有的串口名称的实例
2019/07/02 Python
Python如何使用Gitlab API实现批量的合并分支
2019/11/27 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Python中qutip用法示例详解
2020/10/02 Python
世界上第一个创建了罩杯系统的美国内衣品牌:Maidenform
2019/03/23 全球购物
Moss Bros官网:英国排名第一的西装店
2020/02/26 全球购物
Cecil Mode法国在线商店:女性时尚
2021/01/08 全球购物
亚马逊海外购:亚马逊美国、英国、日本、德国直邮
2021/03/18 全球购物
机械专业应届生求职信
2013/12/12 职场文书
中学自我评价
2014/01/31 职场文书
六五普法规划实施方案
2014/03/21 职场文书
国旗下的演讲稿
2014/05/08 职场文书
机关职员工作检讨书
2014/10/23 职场文书
2015年收银员个人工作总结
2015/04/01 职场文书
酒店财务部岗位职责
2015/04/14 职场文书
2016春季运动会通讯稿
2015/07/18 职场文书
MongoDB连接数据库并创建数据等使用方法
2021/11/27 MongoDB