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 相关文章推荐
如何提高MYSQL数据库的查询统计速度 select 索引应用
Apr 11 PHP
php 用sock技术发送邮件的函数
Jul 21 PHP
PHP 文件上传功能实现代码
Jun 24 PHP
调试一段PHP程序时遇到的三个问题
Jan 17 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
如何使用php输出时间格式
Aug 31 PHP
从PHP的源码中深入了解stdClass类
Apr 18 PHP
PHP直接修改表内容DataGrid功能实现代码
Sep 24 PHP
PHP MPDF中文乱码的解决方式
Dec 08 PHP
Symfony2实现从数据库获取数据的方法小结
Mar 18 PHP
php反射类ReflectionClass用法分析
May 12 PHP
基于thinkPHP类的插入数据库操作功能示例
Jan 06 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使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
2020/04/05 PHP
PHP异常Parse error: syntax error, unexpected T_VAR错误解决方法
2014/05/06 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
在javaScript中关于submit和button的区别介绍
2013/10/20 Javascript
推荐9款炫酷的基于jquery的页面特效
2014/12/07 Javascript
Knockout自定义绑定创建方法
2015/12/26 Javascript
jQuery中实现prop()函数控制多选框(全选,反选)
2016/08/19 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
Vue.use源码分析
2017/04/22 Javascript
移动端效果之Swiper详解
2017/10/09 Javascript
vue 页面加载进度条组件实例
2018/02/05 Javascript
Vue表情输入组件 微信face表情组件
2019/02/11 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
JS+CSS+HTML实现“代码雨”类似黑客帝国文字下落效果
2020/03/17 Javascript
antd 表格列宽自适应方法以及错误处理操作
2020/10/27 Javascript
Python的lambda匿名函数的简单介绍
2013/04/25 Python
Python实现的多线程端口扫描工具分享
2015/01/21 Python
Python的Django框架中的select_related函数对QuerySet 查询的优化
2015/04/01 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
python 中的列表生成式、生成器表达式、模块导入
2019/06/19 Python
python使用html2text库实现从HTML转markdown的方法详解
2020/02/21 Python
Python图像阈值化处理及算法比对实例解析
2020/06/19 Python
python Timer 类使用介绍
2020/12/28 Python
HTML5 Web缓存和运用程序缓存(cookie,session)
2018/01/11 HTML / CSS
英国布鲁姆精品店:Bloom Boutique
2018/03/01 全球购物
L*SPACE官网:比基尼、泳装和度假服装
2019/03/18 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
公司会计主管岗位责任制
2014/03/01 职场文书
我们的节日元宵活动方案
2014/08/23 职场文书
车辆管理制度范本
2015/08/05 职场文书
个人工作总结怎么写?
2019/04/09 职场文书
微信小程序用户授权最佳实践指南
2021/05/08 Javascript