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 ) function getoutlink($body) |
//调用方法
代码如下 | 复制代码 |
$body ="<a href=/ab.htm>aaa</a><a href=http://www.111cn.net>我是外部连接</a>"; echo getoutlink($body); |
代码如下 | 复制代码 |
function imagebmp($img,$file="",$rle=0)
$transparent=imagecolortransparent($img);
if($colorcount==0) {$colorcount=0; $bitcount=24;};
$zbytek=(4-($width/(8/$bitcount))%4)%4; if($bitcount<24) $palsize=pow(2,$bitcount)*4; $size=(floor($width/(8/$bitcount))+$zbytek)*$height+54; // bitmap file header $cc=$colorcount; for($p=0;$p<$colortotal;$p++) $ct=$colortotal;
for($y=$height-1;$y>=0;$y--) if((strlen($bwrite)<8)and(strlen($bwrite)!=0)) if(($rle==1)and($bitcount==8)) if(($t+5)%$width==0)
for($y=$height-1;$y>=0;$y--) }; if($file!="")
function imagecreatefrombmp($file) $f=fopen($file,"r"); if($header=="bm") $sizebitmapinfoheader=freaddword($f); if($bibitcount<24)
for($y=$height-1;$y>=0;$y--) };
$pocetb=0; while(true) $echoit=false; if($echoit)echo "prefix: $prefix suffix: $suffix<br>"; while(!(($prefix==0)and($suffix==0))) for($x=0;$x<strlen($data);$x++) }; };
/*while(!feof($f)) $echoit=false; if($echoit)echo "prefix: $prefix suffix: $suffix<br>"; while(!(($prefix==0)and($suffix==0))) $currentbit=0; for($x=0;$x<strlen($data);$x++) }; };
for($y=$height-1;$y>=0;$y--) };
/* function freadbyte($f) function freadword($f)
function freaddword($f)
function retbits($byte,$start,$len) };
$currentbit=0;
function rgbtohex($red,$green,$blue) function int_to_dword($n)
function decbinx($d,$n) function inttobyte($n) |
//实例方法
代码如下 | 复制代码 |
include_once('bmp.php'); $image=imagecreatefrombmp('a.bmp'); imagejpeg($image,'a.jpeg'); imagedestroy($image); |