php堆排序实现原理与应用方法

 更新时间:2015年01月03日 11:14:59   投稿:shichen2014  
这篇文章主要介绍了php堆排序实现原理与应用方法,较为详细的分析了堆排序的原理及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了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 Hash函数,增强密码安全

    理解php Hash函数,增强密码安全

    服务器和数据库的资料偶尔会被窃取,因此需要保证发生这种情况时一些重要的用户数据,比如密码,是别人无法获取的。这里我们将要讨论Hash的原理,以及它是如何保护Web应用程序中的密码安全的。
    2011-02-02
  • php动态生成版权所有信息的方法

    php动态生成版权所有信息的方法

    这篇文章主要介绍了php动态生成版权所有信息的方法,实例分析了php时间与字符串的操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解

    微信公众平台开发教程③ PHP实现微信公众号支付功能图文详解

    这篇文章主要介绍了微信公众平台开发PHP实现微信公众号支付功能,结合图文形式详细分析了基于php的微信公众号支付功能开发流程、原理及相关操作技巧,需要的朋友可以参考下
    2019-04-04
  • 解析在PHP中使用mysqli扩展库对mysql的操作

    解析在PHP中使用mysqli扩展库对mysql的操作

    本篇文章是对在PHP中使用mysqli扩展库对mysql的操作进行了详细的分析介绍,需要的朋友参考下
    2013-07-07
  • PHP+JS实现文件分块上传的示例代码

    PHP+JS实现文件分块上传的示例代码

    我们在上传大文件时,可能会由于服务器的原因导致文件上传失败,文件过大时由于服务器的配置或响应事件过长导致上传文件失败,这时候我们可以将一个大的文件分为若干块,然后分批次上传到服务端。本文介绍了实现的方法,需要的可以参考一下
    2022-11-11
  • php之对抗Web扫描器的脚本技巧

    php之对抗Web扫描器的脚本技巧

    我们很难保证一个Web程序的安全性,因为鬼知道明天会有什么新的漏洞出现,鬼知道某个模块是不是一个毫无安全意识的程序员编写的。
    2008-10-10
  • PHP多进程简单实例小结

    PHP多进程简单实例小结

    这篇文章主要介绍了PHP多进程,结合简单实例形式总结分析了PHP多进程相关原理、实现方法及操作注意事项,需要的朋友可以参考下
    2019-11-11
  • 基于PHP文件操作的详解

    基于PHP文件操作的详解

    本篇文章是对PHP文件操作的应用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • PHP性能分析工具xhprof的安装使用与注意事项

    PHP性能分析工具xhprof的安装使用与注意事项

    xhprof 是一款Facebook工程师开发和维护的一款PHP性能分析、调试工具,相较于xdebug要更轻量,更节省资源,强烈推荐大家使用。下面这篇文章主要给大家介绍了关于PHP性能分析工具xhprof的安装与使用方法的相关资料,需要的朋友可以参考下。
    2017-12-12
  • php 随机记录mysql rand()造成CPU 100%的解决办法

    php 随机记录mysql rand()造成CPU 100%的解决办法

    mysql数据库有10几万条数据,使用rand()提取随机10条记录,导致服务器cpu占用居高不下直至死机~
    2010-05-05

最新评论