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代码
Mar 03 PHP
dedecms 批量提取第一张图片最为缩略图的代码(文章+软件)
Oct 29 PHP
删除无限分类并同时删除它下面的所有子分类的方法
Aug 08 PHP
PHP 遍历文件实现代码
May 04 PHP
PHP实现的英文名字全拼随机排号脚本
Jul 04 PHP
php获取图片信息的方法详解
Dec 10 PHP
php结合mysql与mysqli扩展处理事务的方法
Jun 29 PHP
深入浅析Yii admin的权限控制
Aug 31 PHP
php简单中奖算法(实例)
Aug 15 PHP
Ajax中的JSON格式与php传输过程全面解析
Nov 14 PHP
Laravel实现短信注册的示例代码
May 29 PHP
你真的了解PHP中的引用符号(&)吗
May 12 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
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
Centos 6.5系统下编译安装PHP 7.0.13的方法
2016/12/19 PHP
PHP的PDO连接讲解
2019/01/24 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
密码强度检测效果实现原理与代码
2013/01/04 Javascript
Microsfot .NET Framework4.0框架 安装失败的解决方法
2013/08/14 Javascript
js实现商城星星评分的效果
2015/12/29 Javascript
JS模态窗口返回值兼容问题的完美解决方法
2016/05/28 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
js实现倒计时及时间对象
2016/11/15 Javascript
form+iframe解决跨域上传文件的方法
2016/11/18 Javascript
纯JS焦点图特效实例(可一个页面多用)
2016/12/07 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
简单了解vue中父子组件如何相互传递值(基础向)
2019/07/12 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
使用webpack5从0到1搭建一个react项目的实现步骤
2020/12/16 Javascript
python的Template使用指南
2014/09/11 Python
python实现计算倒数的方法
2015/07/11 Python
轻松实现python搭建微信公众平台
2016/02/16 Python
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
分享一下Python数据分析常用的8款工具
2018/04/29 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
Django实现学员管理系统
2019/02/26 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
函授毕业个人自我评价
2014/02/20 职场文书
天猫某品牌专卖店运营计划书
2014/03/21 职场文书
解除合同协议书
2014/04/17 职场文书
2014年减负工作总结
2014/12/10 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书
angular异步验证器防抖实例详解
2022/03/31 Javascript
一文了解MYSQL三大范式和表约束
2022/04/03 MySQL