php常用算法汇总文档格式.docx
《php常用算法汇总文档格式.docx》由会员分享,可在线阅读,更多相关《php常用算法汇总文档格式.docx(34页珍藏版)》请在冰豆网上搜索。
$a[0]){
$l[]=$a[$i];
$r[]=$a[$i];
$l=kuaisu($l);
$r=kuaisu($r);
returnarray_merge($l,array($a[0]),$r);
//插入排序O(N*N)
functioncharu($a){
for($i=1;
$t=$a[$i];
for($j=$i;
$j>
0&
&
$a[$j-1]>
$t;
$j--){
$a[$j]=$a[$j-1];
$a[$j]=$t;
//选择排序O(N*N)
functionxuanze($a){
for($i=0;
for($j=$i+1;
$j<
$j++){
if($a[$i]>
$a[$j]){
$t=$a[$j];
$a[$j]=$a[$i];
$a[$i]=$t;
//冒泡排序O(N*N)
functionmaopao($a){
for($j=$c-1;
$i;
if($a[$j]<
$a[$j-1]){
$t=$a[$j-1];
$a[$j-1]=$a[$j];
复制代码代码如下:
/**
*排列组合
*采用二进制方法进行组合的选择,如表示5选3时,只需有3位为1就可以了,所以可得到的组合是0110111100001111001101110等10种组合
*
*@param需要排列的数组$arr
*@param最小个数$min_size
*@return满足条件的新数组组合
*/
functionplzh($arr,$size=5){
$len=count($arr);
$max=pow(2,$len);
$min=pow(2,$size)-1;
$r_arr=array();
for($i=$min;
$i<
$max;
$i++){
$count=0;
$t_arr=array();
for($j=0;
$j<
$len;
$j++){
$a=pow(2,$j);
$t=$i&
$a;
if($t==$a){
$t_arr[]=$arr[$j];
$count++;
if($count==$size){
$r_arr[]=$t_arr;
return$r_arr;
$pl=pl(array(1,2,3,4,5,6,7),5);
var_dump($pl);
php常用算法总汇
/*
多选分类修改,数据入库增删留数组
说明:
$k和$v是一一对应
*/
//旧分类
$a1=array(’1′=>
’杂文’,
’2′=>
’小说’,
’3′=>
’散文’
);
//新分类
$a2=array(’3′=>
’散文’,
’4′=>
’诗歌’,
’6′=>
’文学’
foreach($a1as$k=>
$v)
{
$have=”;
foreach($a2as$ks=>
$vs)
echo“$v==$vs..”;
if($v==$vs)
$have=1;
if(!
array_key_exists($ks,$a1))
$add[$ks]=$vs;
if($have)
$bao[$k]=$v;
}else
$del[$k]=$v;
var_dump($add);
//新增的记录
var_dump($del);
//删除的记录
var_dump($bao);
//保留的记录
方式二:
无key
$a1=array(‘杂文’,'
小说’,'
散文’);
$a2=array(‘散文’,'
诗歌’,'
文学’);
in_array($vs,$a1))
$add[$vs]=$vs;
$bao[]=$v;
$del[]=$v;
—————————-比较全的随机数(字)
classgetRandstrClass{
functiongetCode($length=32,$mode=0){
switch($mode){
case’1′:
$str=’1234567890′;
break;
case’2′:
$str=‘abcdefghijklmnopqrstuvwxyz’;
case’3′:
$str=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’;
case’4′:
$str=‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz’;
case’5′:
$str=‘ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890′;
case’6′:
$str=‘abcdefghijklmnopqrstuvwxyz1234567890′;
default:
$str=‘ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890′;
$randString=”;
$len=strlen($str)-1;
for($i=0;
$i<
$length;
$i++){
$num=mt_rand(0,$len);
$randString.=$str[$num];
return$randString;
$code=newgetRandstrClass();
$length=16;
$mode=1;
$str=$code->
getCode($length,$mode);
echo$str;
$code=NULL;
———————–有两个数值型变量$a,$b,请在不使用用第二个变量的情况下交换它们的值
$a=3;
$b=4;
$a=$a+$b;
$b=$a-$b;
$a=$a-$b;
//list($b,$a)=array($a,$b);
————————–【选择排序(一维数组)】
【基本思想】:
每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
【示例】:
[初始关键字][4938659776132749]
第一趟排序后13[38659776492749]
第二趟排序后1327[659776493849]
第三趟排序后132738[9776496549]
第四趟排序后13273849[49976576]
第五趟排序后1327384949[979776]
第六趟排序后132738494976[7697]
第七趟排序后13273849497676[97]
最后排序结果1327384949767697
functionselect_sort($arr){
$count=count($arr);
for($i=0;
$count;
$k=$i;
for($j=$i+1;
if($arr[$k]>
$arr[$j])
$k=$j;
//最小元素k和i调换
if($k!
=$i){
$tmp=$arr[$i];
$arr[$i]=$arr[$k];
$arr[$k]=$tmp;
return$arr;
————————–【插入排序(一维数组)】
每次将一个待排序的数据元素,插入到前面已经排好序的数列中的适当位置,使数列依然有序;
直到待排序数据元素全部插入完为止。
[初始关键字][49]38659776132749
J=2(38)[3849]659776132749
J=3(65)[384965]9776132749
J=4(97)[38496597]76132749
J=5(76)[3849657697]132749
J=6(13)[133849657697]2749
J=7(27)[13273849657697]49
J=8(49)[1327384949657697]
functioninsert_sort($arr){
for($i=1;
$j=$i-1;
while($arr[$j]>
$tmp){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
$j–;
------------冒泡排序(一维数组)
两两比较待排序数据元素的大小,发现两个数据元素的次序相反时即进行交换,直到没有反序的数据元素为止。
【排序过程】:
设想被排序的数组R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上”漂浮”,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。
functionbubble_sort($array){
$count=count($array);
if($count<
=0)returnfalse;
for($j=$count-1;
$j>
$j–){
if($array[$j]<
$array[$j-1]){
$tmp=$array[$j];
$array[$j]=$array[$j-1];
$array[$j-1]=$tmp;
return$array;
------------------------------汉诺塔的PHP算法
汉诺塔(又称河内塔)问题是印度的一个古老的传说。
开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
解答结果请自己运行计算,程序见尾部。
面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
后来,这个传说就演变为汉诺塔游戏:
1.有三根杆子A,B,C。
A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:
A→C,A→B,C→B,A→C,B→A,B→C,A→C
此外,汉诺塔问题也是程序设计中的经典递归问题。
$objMover=newMover();
$fromPlace='
A'
;
$toPlace='
C'
$assistancePlace='
B'
$objMover->
move(3,$fromPlace,$toPlace,$assistancePlace);
print_r($objMover->
getMovedMessage());
classMover
protected$_tabMessage=array();
publicfunction__construct()
*Enterdescriptionhere…
*
*@paramunknown_type$N,thelargerthenumberis,theheavieritis
*@paramunknown_type$fromPlace
*@paramunknown_type$toPlace
*@paramunknown_type$assistancePlace
publicfunctionmove($N,$fromPlace,$toPlace,$assistancePlace)
if($N==1)
$this->
_tabMessage[]=“Move$Nfrom$fromPlaceto$toPlace”;
}elseif($N>
1){
move(($N-1),$fromPlace,$assistancePlace,$toPlace);
move(($N-1),$assistancePlace,$toPlace,$fromPlace);
publicfunctiongetMovedMessage()
return$this->
_tabMessage;
functionhanoi($n,$x,$y,$z){
if($n==1){
move($x,1,$z);
}else{
hanoi($n-1,$x,$z,$y);
move($x,$n,$z);
hanoi($n-1,$y,$x,$z);
functionmove($x,$n,$z){
echo'
movedisk'
.$n.'
from'
.$x.'
to'
.$z.'
‘;
hanoi(10,’x'
’y'
’z'
?
>
————————————-猴子大王游戏
一群猴子排成一圈,按1,2,…,n依次编号。
然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,
再数到第m只,在把它踢出去…,如此不停的进行下去,
直到最后只剩下一只猴子为止,那只猴子就叫做大王。
要求编程模拟此过程,输入m、n,输出最后那个大王的编号。
结果视图:
z=0/i=0
z=1/i=1
z=2/i=2
z=3/i=3
Array([0]=>
1[1]=>
2[2]=>
3[3]=>
5[4]=>
6)
z=0/i=3
z=1/i=4
z=2/i=0
z=3/i=1
3[2]=>
5[3]=>
z=0/i=1
z=1/i=2
z=2/i=3
z=3/i=0
3[1]=>
5[2]=>
5[1]=>
5)
Kingis:
5
functionmonkeyKing($n,$m){
$monkeys=range(1,$n);
$i=0;
//取出时候的坐标
$z=0;
//数到M的时候停
while(($mnum=count($monkeys))>
1){
if($i==$mnum){
echo‘z=’.$z.’/i=’.$i.’
$z++;
$i++;
if($z==$m){
array_splice($monkeys,–$i,1);
print_r($monkeys);
echo“
“;
return($monkeys[0]);
echo‘Kingis:
’.monkeyKing(20,4);
————————————-翻牌游戏
1-52张扑克牌,初始都翻开朝上
从2开始,以倍数为基础,将2翻一次,4翻一次,6翻一次。
。
52翻一次
从3开始,以倍数为基础,将3翻一次,6翻一次,9翻一次。
48翻一次
从4开始,以倍数为基础,将4翻一次,8翻一次,13翻一次。
….
求最后朝上的牌有哪些?
*Createdon2009-9-30
*Tochangethetemplateforthisgeneratedfilegoto
*Window-Preferences-PHPeclipse-PHP-CodeTemplates
classup
protected$max=52;
protected$min=2;
protected$rs=array
(1);
//结果集,第一张牌是朝上的
functionup()
/*循环得到2-52的整除数组
*Array
(
[2]=>
Array
[0]=>
2
)
[3]=>
3
[4]=>
[1]=>
4
[5]=>
5
[6]=>
6
[7]=>
7
[8]=>
8
[9]=>
9
[10]=>
10
[11]=>
11
[12]=>
12
[13]=>
13
[14]=>
14
[15]=>
15
[16]=>
16
[17]=>
17
[18]=>
18
[19]=>
19
[20]=>
20
[21]=>
21
[22]=>
22
[23]=>
23
[24]=>
24
[25]=>
25
[26]=>
26
[27]=>
[2]