关于PHP中的基础算法,小结一下,也算是本博客的第一篇文章
1.2种排序算法
冒泡排序:
例子:个人见解
5 6 2 3 7 9 第一趟 5 6 2 3 7 9 5 2 6 3 7 9 5 2 3 6 7 9 5 2 3 6 7 9 5 2 3 6 7 9 第二趟 2 5 3 6 7 9 2 3 5 6 7 9 2 3 5 6 7 9 2 3 5 6 7 9 第三趟 2 3 5 6 7 9 2 3 5 6 7 9 2 3 5 6 7 9 第四趟 2 3 5 6 7 9 2 3 5 6 7 9 第五趟 2 3 5 6 7 9
两两比较,每一趟中都会确定出最大的数然后放在右边,冒泡速度较慢,但是比较稳定。
代码方面主要是嵌套的for循环
代码:
1 #冒泡排序 2 #原理两两比较,大的放右边,每次循环会排出一个最大的放在右边 3 function maopao($arr){ 4 $len=count($arr); 5 for ($i=0; $i < $len-1; $i++) { 6 for ($a=0; $a <$len-1-$i ; $a++) { 7 if ($arr[$a]>$arr[$a+1]) { 8 $t=$arr[$a]; 9 $arr[$a]=$arr[$a+1]; 10 $arr[$a+1]=$t; 11 } 12 } 13 } 14 return $arr; 15 16 } 17 $arr=[5,6,8,1,2,3,7,55,69,23,11]; 18 var_dump(maopao($arr));
选择排序:
例子:个人见解
#选择排序 8 5 6 2 4 7 第一趟 5 8 6 2 4 7 5 8 6 2 4 7 2 8 6 5 4 7 2 8 6 5 4 7 2 8 6 5 4 7 第二趟 2 6 8 5 4 7 2 5 8 6 4 7 2 4 8 6 5 7 2 4 8 6 5 7 第三趟 2 4 6 8 5 7 2 4 5 8 6 7 2 4 5 8 6 7 第四趟 2 4 5 6 8 7 2 4 5 6 8 7 第五趟 2 4 5 6 7 8
假设数组中靠左的元素是小的,然后跟右边的元素比较,如果左边的大于右边的就换到左边,每趟都能确定出一个最小值,缺点在于不稳定性,速度快于冒泡排序。
代码:
1 #选择排序 2 #那最左边的和右边比较如果大于就换到右边,每趟确定出一个最小值 3 function xuanze($arr){ 4 $len=count($arr); 5 for ($i=0; $i <$len-1 ; $i++) { 6 //假设当前最左边的元素是最小值,保存下标 7 $key=$i; 8 for ($j=$i+1; $j < $len; $j++) { 9 //如果左边的大于右边的就保存下标 10 if($arr[$key]>$arr[$j]){ 11 $key=$j; 12 } 13 } 14 //找到最小的值,交换下标 15 $temp=$arr[$key]; 16 $arr[$key]=$arr[$i]; 17 $arr[$i]=$temp; 18 } 19 return $arr; 20 } 21 $arr=[11,2,3,55,66,99]; 22 var_dump(xuanze($arr));
快速排序:
原理:先取数组中的任意一个数作为基准数,一般是数组下标的第一个,然后遍历一遍数组,声明两个空数组,升序的话,将小的元素放在左边,将大的元素放在右边,然后利用递归进行继续分多个数组然后排序。
function quick_sort($arr){ $len=count($arr); if($len<=1)return $arr; $left=$right=[]; for($i=1;$i<$len;$++;){ if($arr[0]>$arr[$i]){ $left[]=$arr[$i]; }else{ $right[]=$arr[$i]; } } $left=quick_sort($left); $right=quick_sort($right); return arrr_merge($left,array($arr[0]),$right); }
关于排序先写三个,日后跟新~~
1.2种查找算法
顺序查找:
这个比较简单,原理就是从第一个开始比较直到找到,效率比较低,较稳定。
代码:
#选择排序 #存在值返回该值的下标,不存在返回false function shunxu($arr,$target){ $len=count($arr); for ($i=0; $i <$len ; $i++) { if ($arr[$i]==$target) { return $i; } } return false; } $arr=[2,5,6,3,8,52,6]; var_dump(shunxu($arr,52));
二分法查找
条件严格,数组必须有序排列,效率较高。
原理:取一个中间值进行和要查找的值比较,假如数组升序排序,值大于要查找的值,然后下标减一
#二分法查找 #选择升序数组 function erfen($arr,$target){ $len=count($arr)-1; $middle=ceil($len/2); if ($arr[$middle]==$target) { return true; }elseif($arr[$middle]>$target){ for ($i=0; $i <$middle ; $i++) { if ($arr[$i]==$target) { return true; } } }else{ //因为循环的是长度所以得+1 for ($i=$middle; $i < $len+1 ; $i++) { if ($arr[$i]==$target) { return true; } } } return false; } $arr=[1,2,3,4,5,6,7,10,11]; var_dump(erfen($arr,11));
先写这几个吧,日后在更!