PHP算法和递归

$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$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=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 $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 "
冒泡"; print\_r(array\_reverse($arr)); echo "
冒泡排序"; print\_r(getpao($arr)); echo "
选择排序"; print\_r(select\_sort($arr)); echo "
插入排序"; print\_r(insert\_sort($arr)); echo "
快速排序"; print\_r(quick_sort($arr)); echo "
"; // **递归** 函数自身调用自身,但必须在调用自身前有条件判断,否则无限无限调用下去 function test($a=0,&$result=array()){ // global $result; $a++; if($a<10){ $result\[\]="$a;" test($a,$result); } return $result; print_r(test()); echo "
"; // **递归 利用全局变量** 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) test($a); 无限级分类** $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'\]."
"; $list\[\]=$v; t($arr,$v\['id'\],$lev+1); } } return $list; } $list=t($area); print\_r($area); echo "
"; print_r($list); ?>
博客
32132
07-14 363
07-12 295
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值