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 相关文章推荐
ajax php 实现写入数据库
Sep 02 PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
php查询相似度最高的字符串的方法
Mar 12 PHP
php去掉文件前几行的方法
Jul 29 PHP
CI(CodeIgniter)模型用法实例分析
Jan 20 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
php微信开发之百度天气预报
Nov 18 PHP
php实现构建排除当前元素的乘积数组方法
Oct 06 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
Aug 09 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 26 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&amp;mysql(六)
2006/10/09 PHP
php4的session功能评述(二)
2006/10/09 PHP
php开发过程中关于继承的使用方法分享
2011/06/17 PHP
ThinkPHP中redirect用法分析
2014/12/05 PHP
php 批量查询搜狗sogou代码分享
2015/05/17 PHP
WordPress中限制非管理员用户在文章后只能评论一次
2015/12/31 PHP
基于php伪静态的实现方法解析
2020/07/31 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
2013/10/15 Javascript
javascript遍历控件实例详细解析
2014/01/10 Javascript
详解jquery中$.ajax方法提交表单
2014/11/03 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
JS组件Bootstrap dropdown组件扩展hover事件
2016/04/17 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
Vue组件模板形式实现对象数组数据循环为树形结构(实例代码)
2017/07/31 Javascript
laydate 显示结束时间不小于开始时间的实例
2017/08/11 Javascript
解决vue组件中使用v-for出现告警问题及v for指令介绍
2017/11/11 Javascript
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
基于jQuery拖拽事件的封装
2020/11/29 jQuery
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
scrapy数据存储在mysql数据库的两种方式(同步和异步)
2020/02/18 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
2020/10/21 Python
一个入门级python爬虫教程详解
2021/01/27 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
超级搞笑检讨书
2014/01/15 职场文书
网上签名寄语活动留言
2014/01/18 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
房地产资料员岗位职责
2014/07/02 职场文书
职工宿舍管理制度
2015/08/05 职场文书
Redis集群的关闭与重启操作
2021/07/07 Redis
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技