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下将图片以二进制存入mysql数据库中并显示的实现代码
May 27 PHP
PHP输出数组中重名的元素的几种处理方法
Sep 05 PHP
php加密算法之实现可逆加密算法和解密分享
Jan 21 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
PHP实现CSV文件的导入和导出类
Mar 24 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
PHP读取并输出XML文件数据的简单实现方法
Dec 22 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
laravel 数据迁移与 Eloquent ORM的实现方法
Apr 12 PHP
在laravel中实现事务回滚的方法
Oct 10 PHP
基于thinkphp6.0的success、error实现方法
Nov 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 array_walk() 数组函数
2011/07/12 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
jquery实现的下拉和收缩效果示例
2014/08/21 Javascript
JavaScript 消息框效果【实现代码】
2016/04/27 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
详解Angular5路由传值方式及其相关问题
2018/04/28 Javascript
JavaScript设计模式之职责链模式应用示例
2018/08/07 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
Vue.js@2.6.10更新内置错误处机制Fundebug同步支持相应错误监控
2019/05/13 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
Vue切换Tab动态渲染组件的操作
2020/09/21 Javascript
用Python和MD5实现网站挂马检测程序
2014/03/13 Python
代码实例讲解python3的编码问题
2019/07/08 Python
Python基础之列表常见操作经典实例详解
2020/02/26 Python
详解python变量与数据类型
2020/08/25 Python
美国珠宝网上商店:Jeulia
2016/09/01 全球购物
英国广泛的照明产品网站:Lights4living
2018/01/28 全球购物
通信工程毕业生自荐信
2013/11/01 职场文书
药店主任岗位责任制
2014/02/10 职场文书
2014年公司庆元旦活动方案
2014/03/05 职场文书
私人委托书格式
2014/09/10 职场文书
行政执法队伍作风整顿剖析材料
2014/10/11 职场文书
2014年个人售房协议书
2014/10/30 职场文书
毕业设计指导教师评语
2014/12/30 职场文书
平遥古城导游词
2015/02/03 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
详解MySQL 用户权限管理
2021/04/20 MySQL
Go语言操作数据库及其常规操作的示例代码
2021/04/21 Golang
Python自然语言处理之切分算法详解
2021/04/25 Python
JavaScript原始值与包装对象的详细介绍
2021/05/11 Javascript
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis