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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
php中Smarty模板初体验
Aug 08 PHP
PHP无法访问远程mysql的问题分析及解决
May 16 PHP
保存到桌面、设为桌面且带图标的PHP代码
Nov 19 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
php遍历解析xml字符串的方法
May 05 PHP
zend framework重定向方法小结
May 28 PHP
yii2.0实现创建简单widgets示例
Jul 18 PHP
php+js实现的无刷新下载文件功能示例
Aug 23 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 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无法访问远程mysql的问题分析及解决
2013/05/16 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
PHP使用递归生成文章树
2015/04/21 PHP
PHP实现查询手机归属地的方法详解
2017/04/28 PHP
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
JQuery文本改变触发事件如聚焦事件、失焦事件
2014/01/15 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
JS实现至少包含字母、大小写数字、字符的密码等级的两种方法
2015/02/03 Javascript
nodejs基础应用
2017/02/03 NodeJs
Angular2库初探
2017/03/01 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
深入浅析AngularJS中的一次性数据绑定 (bindonce)
2017/05/11 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
iscroll.js滚动加载实例详解
2017/07/18 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
Nodejs 微信小程序消息推送的实现
2021/01/20 NodeJs
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
网红编程语言Python将纳入高考你怎么看?
2018/06/07 Python
python设计tcp数据包协议类的例子
2019/07/23 Python
关于阿里云oss获取sts凭证 app直传 python的实例
2019/08/20 Python
Python爬虫爬取煎蛋网图片代码实例
2019/12/16 Python
python 使用csv模块读写csv格式文件的示例
2020/12/02 Python
利用HTML5+css3+jquery+weui实现仿微信聊天界面功能
2018/01/08 HTML / CSS
印尼最大的网上书店:Gramedia.com
2018/09/13 全球购物
香港草莓网:Strawberrynet香港
2019/05/10 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
服装销售人员求职自我评价
2013/09/26 职场文书
业务员岗位职责
2013/11/16 职场文书
员工培训心得体会
2013/12/30 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
婚礼必备主持词范本!
2019/07/23 职场文书
golang json数组拼接的实例
2021/04/28 Golang