菜单

PHP算法和递归

2016-03-07 - Developer

<?php
header(“Content-Type:text/html;charset=utf-8”);
$arr=array(1,12,53,14,5,16,7,18,91,10,11,120);
//冒泡排序 小数往前放,大数往后放
function getpao($arr)
{
$len=count($arr);
//设置一个空数组 用来接收冒出来的泡
//该层循环控制 需要冒泡的轮数
for($i=1;$i<$len;$i++)
{ //该层循环用来控制每轮 冒出一个数 需要比较的次数
for($k=0;$k<$len-$i;$k++)
{
if($arr[$k]>$arr[$k+1])
{
$tmp=$arr[$k+1];
$arr[$k+1]=$arr[$k];
$arr[$k]=$tmp;
}
}
}
return $arr;
}
//选择排序
/* 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,
顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法 */
function select_sort($arr){
for($i=0,$len=count($arr);$i<$len-1;$i++){
//假设最小值位置
$p=$i;
//当前都和那些元素比较,$i后面的元素
for($j=$i+1;$j<$len;$j++){
if($arr[$p]>$arr[$j]){
//比较发现更小的,记录最小值位置,并且在在下次比较时
$p=$j;
}
}
//已确定最小值的位置,保存到$p中
if($p != $i){
$tmp=$arr[$p];
$arr[$p]=$arr[$i];
$arr[$i]=$tmp;
}
}
return $arr;
}
//插入排序
/* 从第一个元素开始,该元素可以认为已经被排序
取出下一个元素,在已经排序的元素序列中从后向前扫描
如果该元素(已排序)大于新元素,将该元素移到下一位置
重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
将新元素插入到下一位置中 */
function insert_sort($arr) {
//区分 哪部分是已经排序好的
//哪部分是没有排序的
//找到其中一个需要排序的元素
//这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
//利用循环就可以标志出来
//i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
//间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
for($i=1, $len=count($arr); $i<$len; $i++) {
//获得当前需要比较的元素值。
$tmp = $arr[$i];
//内层循环控制 比较 并 插入
for($j=$i-1;$j>=0;$j–) {
//$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
if($tmp < $arr[$j]) {
//发现插入的元素要小,交换位置
//将后边的元素与前面的元素互换
$arr[$j+1] = $arr[$j];
//将前面的数设置为 当前需要交换的数
$arr[$j] = $tmp;
} else {
//如果碰到不需要移动的元素
//由于是已经排序好是数组,则前面的就不需要再次比较了。
break;
}
}
}
//将这个元素 插入到已经排序好的序列内。
//返回
return $arr;
}
//快速排序法 对冒泡排序的一种改进
/* 通过一趟排序将要排序的数据分割成独立的两部分,
其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,
整个排序过程可以递归进行,以此达到整个数据变成有序序列 */
function quick_sort($arr) {
//先判断是否需要继续进行
$length = count($arr);
if($length <= 1) {
return $arr;
}
//如果没有返回,说明数组内的元素个数 多余1个,需要排序
//选择一个标尺
//选择第一个元素
$base_num = $arr[0];
//遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
//初始化两个数组
$left_array = array();//小于标尺的
$right_array = array();//大于标尺的
for($i=1; $i<$length; $i++) {
if($base_num > $arr[$i]) {
//放入左边数组
$left_array[] = $arr[$i];
} else {
//放入右边
$right_array[] = $arr[$i];
}
}
//再分别对 左边 和 右边的数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array = quick_sort($left_array);
$right_array = quick_sort($right_array);
//合并左边 标尺 右边
return array_merge($left_array, array($base_num), $right_array);
}

print_r($arr);
echo “<br />冒泡”;
print_r(array_reverse($arr));
echo “<br />冒泡排序”;
print_r(getpao($arr));
echo “<br />选择排序”;
print_r(select_sort($arr));
echo “<br />插入排序”;
print_r(insert_sort($arr));
echo “<br />快速排序”;
print_r(quick_sort($arr));
echo “<br />”;

// 递归 函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去
function test($a=0,&$result=array()){
// global $result;
$a++;
if($a<10){
$result[]=$a;
test($a,$result);
}
return $result;
}
print_r(test());
echo “<br />”;
//递归 利用全局变量
function test($a=0,$result=array()){
global $result;
$a++;
if ($a<10) {
$result[]=$a;
test($a,$result);
}
return $result;
}
//递归 利用静态变量 递归函数间作为“桥梁”的变量利用static进行初始化,每一次递归都会保留”桥梁变量”的值。
function test($a=0){
static $result=array();
$a++;
if ($a<10) {
$result[]=$a;
test($a);
}
return $result;
}

//递归 无限级分类
$area = array(
array(‘id’=>1,’area’=>’北京’,’pid’=>0),
array(‘id’=>2,’area’=>’广西’,’pid’=>0),
array(‘id’=>3,’area’=>’广东’,’pid’=>0),
array(‘id’=>4,’area’=>’福建’,’pid’=>0),
array(‘id’=>11,’area’=>’朝阳区’,’pid’=>1),
array(‘id’=>12,’area’=>’海淀区’,’pid’=>1),
array(‘id’=>21,’area’=>’南宁市’,’pid’=>2),
array(‘id’=>45,’area’=>’福州市’,’pid’=>4),
array(‘id’=>113,’area’=>’亚运村’,’pid’=>11),
array(‘id’=>115,’area’=>’奥运村’,’pid’=>11),
array(‘id’=>234,’area’=>’武鸣县’,’pid’=>21)
);
function t($arr,$pid=0,$lev=0){
static $list=array();
foreach ($arr as $v){
if($v[‘pid’]==$pid){
echo str_repeat(“”,$lev).$v[‘area’].”<br />”;
$list[]=$v;
t($arr,$v[‘id’],$lev+1);
}
}
return $list;
}
$list=t($area);
print_r($area);
echo “<br />”;
print_r($list);
?>

转载请注明: 转载自—艾瑞可erik

本文链接地址: http://erik.xyz/1190.html

发表评论