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&amp;java(一)
Oct 09 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
PHP 读取文件内容代码(txt,js等)
Dec 06 PHP
PHP过滤★等特殊符号的正则
Jan 27 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
php 伪造ip以及url来路信息方法汇总
Nov 25 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
yii实现CheckBox复选框在同一行显示的方法
Dec 03 PHP
php实现对两个数组进行减法操作的方法
Apr 17 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
非常重要的php正则表达式详解
Jan 04 PHP
Laravel统一错误处理为JSON的方法介绍
Oct 18 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
PHP 5.0对象模型深度探索之对象复制
2008/03/27 PHP
ThinkPHP模板判断输出Present标签用法详解
2014/06/30 PHP
利用PHP绘图函数实现简单验证码功能的方法
2016/10/18 PHP
ThinkPHP 3使用OSS的方法
2018/07/19 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
ext for eclipse插件安装方法
2008/04/27 Javascript
jQuery EasyUI API 中文文档 - Panel面板
2011/09/30 Javascript
Jquery EasyUI中弹出确认对话框以及加载效果示例代码
2014/02/13 Javascript
高性能JavaScript模板引擎实现原理详解
2015/02/05 Javascript
了解VUE的render函数的使用
2017/06/08 Javascript
JQuery 获取Dom元素的实例讲解
2017/07/08 jQuery
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
angularjs实现table增加tr的方法
2018/02/27 Javascript
javascript sort()对数组中的元素进行排序详解
2019/10/13 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
python生成随机验证码(中文验证码)示例
2014/04/03 Python
python脚本实现统计日志文件中的ip访问次数代码分享
2014/08/06 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
python实现可逆简单的加密算法
2019/03/22 Python
python pillow库的基础使用教程
2021/01/13 Python
使用HTML和CSS3绘制基本卡通图案的示例分享
2015/11/06 HTML / CSS
什么是Linux虚拟文件系统VFS
2012/01/31 面试题
幼儿园实习自我鉴定
2013/12/15 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
法律进机关实施方案
2014/03/12 职场文书
小学学校评估方案
2014/06/08 职场文书
教师反腐倡廉演讲稿
2014/09/03 职场文书
2014年团员学习十八大思想汇报
2014/09/13 职场文书
群众路线个人对照检查材料2014
2014/09/26 职场文书
高一化学教学反思
2016/02/22 职场文书
nginx网站服务如何配置防盗链(推荐)
2021/03/31 Servers
MySQL数据迁移相关总结
2021/04/29 MySQL
vue-cli3.x配置全局的scss的时候报错问题及解决
2022/04/30 Vue.js
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers