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中使用与Perl兼容的正则表达式
Nov 26 PHP
php插入中文到sqlserver 2008里出现乱码的解决办法分享
Jul 19 PHP
探讨如何在php168_cms中提取验证码
Jun 08 PHP
php实现文件下载代码分享
Aug 19 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
Jan 05 PHP
HTML中嵌入PHP的简单方法
Feb 16 PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 PHP
php 生成加密公钥加密私钥实例详解
Jun 16 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
Feb 07 PHP
关于PHP数组迭代器的使用方法实例
Nov 17 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编程网上资源导航
2006/10/09 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
php实现scws中文分词搜索的方法
2015/12/25 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
Visual Studio中的jQuery智能提示设置方法
2010/03/27 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
提取jquery的ready()方法单独使用示例
2014/03/25 Javascript
Node.js事件循环(Event Loop)和线程池详解
2015/01/28 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
浅析jQuery Mobile的初始化事件
2015/12/03 Javascript
Web Uploader文件上传插件使用详解
2016/05/10 Javascript
JavaScript判断数组是否存在key的简单实例
2016/08/03 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
详解Node 定时器
2018/02/26 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
nodejs中express入门和基础知识点学习
2018/09/13 NodeJs
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
taro 实现购物车逻辑的实例代码
2020/06/05 Javascript
Python实现字符串逆序输出功能示例
2017/06/24 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
Python3 循环语句(for、while、break、range等)
2017/11/20 Python
python实现微信跳一跳辅助工具步骤详解
2018/01/04 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python之随机数函数的实现示例
2020/12/30 Python
平民服装店创业计划书
2014/01/17 职场文书
单位承诺书格式
2014/05/21 职场文书
北京故宫的导游词
2015/01/31 职场文书
清洁员岗位职责
2015/02/15 职场文书
机修车间主任岗位职责
2015/04/08 职场文书
简爱电影观后感
2015/06/10 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
安全生产感想
2015/08/07 职场文书
小学四年级班主任工作经验交流材料
2015/11/02 职场文书
MYSQL 运算符总结
2021/11/11 MySQL