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树的代码,可以嵌套任意层
Oct 09 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
Jan 26 PHP
mantis安装、配置和使用中的问题小结
Jul 14 PHP
取得单条网站评论以数组形式进行输出
Jul 28 PHP
php类常量用法实例分析
Jul 09 PHP
配置eAccelerator和XCache扩展来加速PHP程序的执行
Dec 22 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
Thinkphp整合微信支付功能
Dec 14 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
Feb 28 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP goto语句用法实例
Aug 06 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
不用数据库的多用户文件自由上传投票系统(3)
2006/10/09 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
一个报数游戏js版(约瑟夫环问题)
2010/08/05 Javascript
JQuery操作表格(隔行着色,高亮显示,筛选数据)
2012/02/23 Javascript
浅谈javascript 函数属性和方法
2015/01/21 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
Vue.js快速入门实例教程
2016/10/15 Javascript
Bootstrap select下拉联动(jQuery cxselect)
2017/01/04 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
JS重学系列之聊聊new操作符
2019/03/04 Javascript
layui加载数据显示loading加载完成loading消失的实例代码
2019/09/23 Javascript
JavaScript Canvas编写炫彩的网页时钟
2019/10/16 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
Python 常用string函数详解
2016/05/30 Python
详解Django 中是否使用时区的区别
2018/06/14 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
利用Python产生加密表和解密表的实现方法
2019/10/15 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
为什么说python更适合树莓派编程
2020/07/20 Python
深入浅析css3 border-image边框图像详解
2015/11/24 HTML / CSS
CSS 3.0 结合video视频实现的创意开幕效果
2020/06/01 HTML / CSS
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
阿根廷旅游网站:almundo阿根廷
2018/02/12 全球购物
党员自我评价分享
2013/12/13 职场文书
关于幼儿的自我评价
2013/12/18 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014年客房服务员工作总结
2014/11/18 职场文书
2019学生会干事辞职信
2019/06/27 职场文书