php堆排序实现原理与应用程序代码

 更新时间:2016年11月25日 16:28  点击:2031

author:        lajabs
email:        agl0dhlvqgdtywlslmnvbq==

本文以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

*/
heaps教程ort($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;
}

  //--------------------------------------------------
  function getindextext($okstr,$ilen=-1)
  {
    if($okstr=="") return "";
    $ws = explode(" ",$okstr);
    $okstr = "";
    $wks = "";
    foreach($ws as $w)
    {
      $w = trim($w);
      //排除小于2的字符
      if(strlen($w)<2) continue;
      //排除数字或日期
      if(!ereg("[^0-9:-]",$w)) continue;
      if(strlen($w)==2&&ord($w[0])>0x80) continue;
      if(isset($wks[$w])) $wks[$w]++;
      else $wks[$w] = 1;
    }
    if(is_array($wks))
    {
      arsort($wks);
      if($ilen==-1)
      { foreach($wks as $w=>$v) $okstr .= $w." "; }
      else
      {
        foreach($wks as $w=>$v){
          if((strlen($okstr)+strlen($w)+1)<$ilen) $okstr .= $w." ";
          else break;
        }
      }
    }
    return trim($okstr);
  }?>

打开php.ini,首先找到
;;;;;;;;;;;;;;;;
; file uploads ;
;;;;;;;;;;;;;;;;
区域,有影响文件上传的以下几个参数:

file_uploads   =   on   ;是否允许通过http上传文件的开关。默认为on即是开

upload_tmp_dir   ;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹

upload_max_filesize   =   8m   ;望文生意,即允许上传文件大小的最大值。默认为2m



;;;;;;;;;;;;;;;;;
; data handling ;
;;;;;;;;;;;;;;;;;
区域,还有一项:

post_max_size   =   8m ;指通过表单post给php的所能接收的最大值,包括表单里的所有值。默认为8m


一般地,设置好上述四个参数后,上传<=8m的文件是不成问题,在网络正常的情况下。


但如果要上传>8m的大体积文件,只设置上述四项还一定能行的通。除非你的网络真有100m/s的上传高速,否则你还得关心关心下面的参数:

;;;;;;;;;;;;;;;;;;;
; resource limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time   =   600 ;每个php页面运行的最大时间值(秒),默认30秒

max_input_time = 600 ;每个php页面接收数据所需的最大时间,默认60秒

memory_limit   =   8m   ;每个php页面所吃掉的最大内存,默认8m

 代码如下 复制代码

function deleteemptyarray( $val )
{
 $links ='';
 if( is_array( $val ) )
 {
  foreach( $val as $v =>$_v)
  {
   if( !empty( $_v[0] ) )
   {
    $links .=$_v[0].'|';
   }
  }  
  return substr($links,0,-1);
 }
 else
 {
  return false;
 }
}

function getoutlink($body)
{
 
 $tempcontent = $body;
 preg_match_all("/<a(.*?)href=(.*?)</a>/i",$tempcontent,$tempurl);
 $urls =array();
 foreach($tempurl[0] as $value)
 {
  if(strstr($value,'http') )
  {
   if(stristr($value ,$localurl))
   {
    continue;
   }
   else
   {    
    preg_match_all("/hrefs*=s*(['"]?)(.*?)\1/is", $value, $vlink);    
    $urls[] = $vlink[2];
   }
  }
 }
 //print_r($urls);
 $strurl = explode('|',deleteemptyarray( $urls));
 $tempcount = array_unique($strurl);
 echo '&nbsp;外链'.count($tempcount)-1;
}

//调用方法

 代码如下 复制代码
$body ="<a href=/ab.htm>aaa</a><a href=http://www.111cn.net>我是外部连接</a>";
echo getoutlink($body);
 代码如下 复制代码

function imagebmp($img,$file="",$rle=0)
{


$colorcount=imagecolorstotal($img);

$transparent=imagecolortransparent($img);
$istransparent=$transparent!=-1;


if($istransparent) $colorcount--;

if($colorcount==0) {$colorcount=0; $bitcount=24;};
if(($colorcount>0)and($colorcount<=2)) {$colorcount=2; $bitcount=1;};
if(($colorcount>2)and($colorcount<=16)) { $colorcount=16; $bitcount=4;};
if(($colorcount>16)and($colorcount<=256)) { $colorcount=0; $bitcount=8;};


                $width=imagesx($img);
                $height=imagesy($img);

                $zbytek=(4-($width/(8/$bitcount))%4)%4;

                if($bitcount<24) $palsize=pow(2,$bitcount)*4;

                $size=(floor($width/(8/$bitcount))+$zbytek)*$height+54;
                $size+=$palsize;
                $offset=54+$palsize;

                // bitmap file header
                $ret = 'bm';                        // header (2b)
                $ret .= int_to_dword($size);        // size of file (4b)
                $ret .= int_to_dword(0);        // reserved (4b)
                $ret .= int_to_dword($offset);        // byte location in the file which is first byte of image (4b)
                // bitmap info header
                $ret .= int_to_dword(40);        // size of bitmapinfoheader (4b)
                $ret .= int_to_dword($width);        // width of bitmap (4b)
                $ret .= int_to_dword($height);        // height of bitmap (4b)
                $ret .= int_to_word(1);        // biplanes = 1 (2b)
                $ret .= int_to_word($bitcount);        // bibitcount = {1 (mono) or 4 (16 clr ) or 8 (256 clr) or 24 (16 mil)} (2b)
                $ret .= int_to_dword($rle);        // rle compression (4b)
                $ret .= int_to_dword(0);        // width x height (4b)
                $ret .= int_to_dword(0);        // bixpelspermeter (4b)
                $ret .= int_to_dword(0);        // biypelspermeter (4b)
                $ret .= int_to_dword(0);        // number of palettes used (4b)
                $ret .= int_to_dword(0);        // number of important colour (4b)
                // image data

                $cc=$colorcount;
                $sl1=strlen($ret);
                if($cc==0) $cc=256;
                if($bitcount<24)
                   {
                    $colortotal=imagecolorstotal($img);
                     if($istransparent) $colortotal--;

                     for($p=0;$p<$colortotal;$p++)
                     {
                      $color=imagecolorsforindex($img,$p);
                       $ret.=inttobyte($color["blue"]);
                       $ret.=inttobyte($color["green"]);
                       $ret.=inttobyte($color["red"]);
                       $ret.=inttobyte(0); //reserved
                     };

                    $ct=$colortotal;
                  for($p=$colortotal;$p<$cc;$p++)
                       {
                      $ret.=inttobyte(0);
                      $ret.=inttobyte(0);
                      $ret.=inttobyte(0);
                      $ret.=inttobyte(0); //reserved
                     };
                   };


if($bitcount<=8)
{

 for($y=$height-1;$y>=0;$y--)
 {
  $bwrite="";
  for($x=0;$x<$width;$x++)
   {
   $color=imagecolorat($img,$x,$y);
   $bwrite.=decbinx($color,$bitcount);
   if(strlen($bwrite)==8)
    {
     $retd.=inttobyte(bindec($bwrite));
     $bwrite="";
    };
   };

  if((strlen($bwrite)<8)and(strlen($bwrite)!=0))
    {
     $sl=strlen($bwrite);
     for($t=0;$t<8-$sl;$t++)
      $sl.="0";
     $retd.=inttobyte(bindec($bwrite));
    };
 for($z=0;$z<$zbytek;$z++)
   $retd.=inttobyte(0);
 };
};

if(($rle==1)and($bitcount==8))
{
 for($t=0;$t<strlen($retd);$t+=4)
  {
   if($t!=0)
   if(($t)%$width==0)
    $ret.=chr(0).chr(0);

   if(($t+5)%$width==0)
   {
     $ret.=chr(0).chr(5).substr($retd,$t,5).chr(0);
     $t+=1;
   }
   if(($t+6)%$width==0)
    {
     $ret.=chr(0).chr(6).substr($retd,$t,6);
     $t+=2;
    }
    else
    {
     $ret.=chr(0).chr(4).substr($retd,$t,4);
    };
  };
  $ret.=chr(0).chr(1);
}
else
{
$ret.=$retd;
};


                if($bitcount==24)
                {
                for($z=0;$z<$zbytek;$z++)
                 $dopl.=chr(0);

                for($y=$height-1;$y>=0;$y--)
                 {
                 for($x=0;$x<$width;$x++)
                        {
                           $color=imagecolorsforindex($img,imagecolorat($img,$x,$y));
                           $ret.=chr($color["blue"]).chr($color["green"]).chr($color["red"]);
                        }
                 $ret.=$dopl;
                 };

                 };

  if($file!="")
   {
    $r=($f=fopen($file,"w"));
    $r=$r and fwrite($f,$ret);
    $r=$r and fclose($f);
    return $r;
   }
  else
  {
   echo $ret;
  };
};


/*
*------------------------------------------------------------
*                    imagecreatefrombmp
*------------------------------------------------------------
*            - reads image from a bmp file
*
*         parameters:  $file - target file to load
*
*            returns: image id
*/

function imagecreatefrombmp($file)
{
global  $currentbit, $echomode;

$f=fopen($file,"r");
$header=fread($f,2);

if($header=="bm")
{
 $size=freaddword($f);
 $reserved1=freadword($f);
 $reserved2=freadword($f);
 $firstbyteofimage=freaddword($f);

 $sizebitmapinfoheader=freaddword($f);
 $width=freaddword($f);
 $height=freaddword($f);
 $biplanes=freadword($f);
 $bibitcount=freadword($f);
 $rlecompression=freaddword($f);
 $widthxheight=freaddword($f);
 $bixpelspermeter=freaddword($f);
 $biypelspermeter=freaddword($f);
 $numberofpalettesused=freaddword($f);
 $numberofimportantcolors=freaddword($f);

if($bibitcount<24)
 {
  $img=imagecreate($width,$height);
  $colors=pow(2,$bibitcount);
  for($p=0;$p<$colors;$p++)
   {
    $b=freadbyte($f);
    $g=freadbyte($f);
    $r=freadbyte($f);
    $reserved=freadbyte($f);
    $palette[]=imagecolorallocate($img,$r,$g,$b);
   };

 


if($rlecompression==0)
{
   $zbytek=(4-ceil(($width/(8/$bibitcount)))%4)%4;

for($y=$height-1;$y>=0;$y--)
    {
     $currentbit=0;
     for($x=0;$x<$width;$x++)
      {
         $c=freadbits($f,$bibitcount);
       imagesetpixel($img,$x,$y,$palette[$c]);
      };
    if($currentbit!=0) {freadbyte($f);};
    for($g=0;$g<$zbytek;$g++)
     freadbyte($f);
     };

 };
};


if($rlecompression==1) //$bi_rle8
{
$y=$height;

$pocetb=0;

while(true)
{
$y--;
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;

$echoit=false;

if($echoit)echo "prefix: $prefix suffix: $suffix<br>";
if(($prefix==0)and($suffix==1)) break;
if(feof($f)) break;

while(!(($prefix==0)and($suffix==0)))
{
 if($prefix==0)
  {
   $pocet=$suffix;
   $data.=fread($f,$pocet);
   $pocetb+=$pocet;
   if($pocetb%2==1) {freadbyte($f); $pocetb++;};
  };
 if($prefix>0)
  {
   $pocet=$prefix;
   for($r=0;$r<$pocet;$r++)
    $data.=chr($suffix);
  };
 $prefix=freadbyte($f);
 $suffix=freadbyte($f);
 $pocetb+=2;
 if($echoit) echo "prefix: $prefix suffix: $suffix<br>";
};

for($x=0;$x<strlen($data);$x++)
 {
  imagesetpixel($img,$x,$y,$palette[ord($data[$x])]);
 };
$data="";

};

};


if($rlecompression==2) //$bi_rle4
{
$y=$height;
$pocetb=0;

/*while(!feof($f))
 echo freadbyte($f)."_".freadbyte($f)."<br>";*/
while(true)
{
//break;
$y--;
$prefix=freadbyte($f);
$suffix=freadbyte($f);
$pocetb+=2;

$echoit=false;

if($echoit)echo "prefix: $prefix suffix: $suffix<br>";
if(($prefix==0)and($suffix==1)) break;
if(feof($f)) break;

while(!(($prefix==0)and($suffix==0)))
{
 if($prefix==0)
  {
   $pocet=$suffix;

   $currentbit=0;
   for($h=0;$h<$pocet;$h++)
    $data.=chr(freadbits($f,4));
   if($currentbit!=0) freadbits($f,4);
   $pocetb+=ceil(($pocet/2));
   if($pocetb%2==1) {freadbyte($f); $pocetb++;};
  };
 if($prefix>0)
  {
   $pocet=$prefix;
   $i=0;
   for($r=0;$r<$pocet;$r++)
    {
    if($i%2==0)
     {
      $data.=chr($suffix%16);
     }
     else
     {
      $data.=chr(floor($suffix/16));
     };
    $i++;
    };
  };
 $prefix=freadbyte($f);
 $suffix=freadbyte($f);
 $pocetb+=2;
 if($echoit) echo "prefix: $prefix suffix: $suffix<br>";
};

for($x=0;$x<strlen($data);$x++)
 {
  imagesetpixel($img,$x,$y,$palette[ord($data[$x])]);
 };
$data="";

};

};


 if($bibitcount==24)
{
 $img=imagecreatetruecolor($width,$height);
 $zbytek=$width%4;

   for($y=$height-1;$y>=0;$y--)
    {
     for($x=0;$x<$width;$x++)
      {
       $b=freadbyte($f);
       $g=freadbyte($f);
       $r=freadbyte($f);
       $color=imagecolorexact($img,$r,$g,$b);
       if($color==-1) $color=imagecolorallocate($img,$r,$g,$b);
       imagesetpixel($img,$x,$y,$color);
      }
    for($z=0;$z<$zbytek;$z++)
     freadbyte($f);
   };
};
return $img;

};


fclose($f);


};

 

 

/*
* helping functions:
*-------------------------
*
* freadbyte($file) - reads 1 byte from $file
* freadword($file) - reads 2 bytes (1 word) from $file
* freaddword($file) - reads 4 bytes (1 dword) from $file
* freadlngint($file) - same as freaddword($file)
* decbin8($d) - returns binary string of d zero filled to 8
* retbits($byte,$start,$len) - returns bits $start->$start+$len from $byte
* freadbits($file,$count) - reads next $count bits from $file
* rgbtohex($r,$g,$b) - convert $r, $g, $b to hex
* int_to_dword($n) - returns 4 byte representation of $n
* int_to_word($n) - returns 2 byte representation of $n
*/

function freadbyte($f)
{
 return ord(fread($f,1));
};

function freadword($f)
{
 $b1=freadbyte($f);
 $b2=freadbyte($f);
 return $b2*256+$b1;
};


function freadlngint($f)
{
return freaddword($f);
};

function freaddword($f)
{
 $b1=freadword($f);
 $b2=freadword($f);
 return $b2*65536+$b1;
};

 

function retbits($byte,$start,$len)
{
$bin=decbin8($byte);
$r=bindec(substr($bin,$start,$len));
return $r;

};

 

$currentbit=0;
function freadbits($f,$count)
{
 global $currentbit,$smode;
 $byte=freadbyte($f);
 $lastcbit=$currentbit;
 $currentbit+=$count;
 if($currentbit==8)
  {
   $currentbit=0;
  }
 else
  {
   fseek($f,ftell($f)-1);
  };
 return retbits($byte,$lastcbit,$count);
};

 

function rgbtohex($red,$green,$blue)
  {
   $hred=dechex($red);if(strlen($hred)==1) $hred="0$hred";
   $hgreen=dechex($green);if(strlen($hgreen)==1) $hgreen="0$hgreen";
   $hblue=dechex($blue);if(strlen($hblue)==1) $hblue="0$hblue";
   return($hred.$hgreen.$hblue);
  };

        function int_to_dword($n)
        {
                return chr($n & 255).chr(($n >> 8) & 255).chr(($n >> 16) & 255).chr(($n >> 24) & 255);
        }
        function int_to_word($n)
        {
                return chr($n & 255).chr(($n >> 8) & 255);
        }


function decbin8($d)
{
return decbinx($d,8);
};

function decbinx($d,$n)
{
$bin=decbin($d);
$sbin=strlen($bin);
for($j=0;$j<$n-$sbin;$j++)
 $bin="0$bin";
return $bin;
};

function inttobyte($n)
{
return chr($n);
};

//实例方法

 代码如下 复制代码
include_once('bmp.php');
$image=imagecreatefrombmp('a.bmp');
imagejpeg($image,'a.jpeg');
imagedestroy($image);

 

[!--infotagslink--]

相关文章

  • C#开发Windows窗体应用程序的简单操作步骤

    这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
  • C++调用C#的DLL程序实现方法

    本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
  • C#使用Process类调用外部exe程序

    本文通过两个示例讲解了一下Process类调用外部应用程序的基本用法,并简单讲解了StartInfo属性,有需要的朋友可以参考一下。...2020-06-25
  • 微信小程序 页面传值详解

    这篇文章主要介绍了微信小程序 页面传值详解的相关资料,需要的朋友可以参考下...2017-03-13
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • uniapp微信小程序:key失效的解决方法

    这篇文章主要介绍了uniapp微信小程序:key失效的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-01-20
  • 将c#编写的程序打包成应用程序的实现步骤分享(安装,卸载) 图文

    时常会写用c#一些程序,但如何将他们和photoshop一样的大型软件打成一个压缩包,以便于发布....2020-06-25
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 微信小程序自定义tabbar组件

    这篇文章主要为大家详细介绍了微信小程序自定义tabbar组件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-03-14
  • 微信小程序 网络请求(GET请求)详解

    这篇文章主要介绍了微信小程序 网络请求(GET请求)详解的相关资料,需要的朋友可以参考下...2016-11-22
  • 微信小程序二维码生成工具 weapp-qrcode详解

    这篇文章主要介绍了微信小程序 二维码生成工具 weapp-qrcode详解,教大家如何在项目中引入weapp-qrcode.js文件,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...2021-10-23
  • 微信小程序如何获取图片宽度与高度

    这篇文章主要给大家介绍了关于微信小程序如何获取图片宽度与高度的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-10
  • Python爬取微信小程序通用方法代码实例详解

    这篇文章主要介绍了Python爬取微信小程序通用方法代码实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-09-29
  • 微信小程序(应用号)开发新闻客户端实例

    这篇文章主要介绍了微信小程序(应用号)开发新闻客户端实例的相关资料,需要的朋友可以参考下...2016-10-25
  • 微信小程序手势操作之单触摸点与多触摸点

    这篇文章主要介绍了微信小程序手势操作之单触摸点与多触摸点的相关资料,需要的朋友可以参考下...2017-03-13
  • 微信小程序实现canvas分享朋友圈海报

    这篇文章主要为大家详细介绍了微信小程序实现canvas分享朋友圈海报,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-21
  • 微信小程序 页面跳转传递值几种方法详解

    这篇文章主要介绍了微信小程序 页面跳转传递值几种方法详解的相关资料,需要的朋友可以参考下...2017-01-16
  • 手把手教你uniapp和小程序分包(图文)

    本文主要介绍了手把手教你uniapp和小程序分包,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-02
  • 微信小程序实现点击导航条切换页面

    这篇文章主要为大家详细介绍了微信小程序实现点击导航条切换页面,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-11-19
  • 微信小程序实现登录页云层漂浮的动画效果

    微信小程序目前的火热程度相信不用多言,最近利用空余时间用小程序实现了个动态的登录页效果,所以下面这篇文章主要给大家介绍了利用微信小程序实现登录页云层漂浮动画效果的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2017-05-09