快速排序
1、原理:
找到当前数组中的任意一个元素(一般选择第一个元素),作为标准,新建两个空数组,遍历整个数组元素,
如果遍历到的元素比当前的元素要小,那么就放到左边的数组,否则放到右面的数组,然后再对新数组进行同样的操作
2、递归:
程序调用自身的编程技巧称为递归。
- 递归必须要有边界条件,也就是递归出口(退出递归)
- 递归前进段和递归返回段,也就是最后得到的值
- 当边界条件不满足时,递归前进;当边界条件(递归出口)满足时,递归返回
例子:
递归计算阶乘:
<?php funtion digui($n){ if($n==1){ return 1; } return digui($n-1)*$n; } $a=6; echo "{$a}的阶乘为:{$a}!=".digui($a);
//输出
6的阶乘为:6!=720;
递推:
用若干步可重复运算来描述复杂问题的方法
通常是通过计算前面的一些项来得出序列中的指定项的值
例子:
求斐波那契数列的第n项的值
斐波那契数列的规律:1, 1, 2, 3, 5, 8, 13, 21…(最前的两个数都为1,从第3位开始,后面每位数为前两位数的和)
<?php function fbnq($n){ $n1=1;//斐波那契数列第一项初始为1 $n2=1;//斐波那契数列第二项初始为1 $result=0; for($i=3,$i<=$n;++$i){ $result=$n1+$n2; $n1=$n2;//更新旧值 $n2=$result;//更新旧值 } return $result; } $a=fbnq(7);//求斐波那契数列第7个数 echo "斐波那契数列第7项为:".$a;
//输出
斐波那契数列第7项为:13
4、快速排序的思想;
通过一趟排序将待排记录分割成独立的两部分,其中一部分的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行快速排序,整个排序过程可以递归进行,以达到整个序列有序的目的
代码:
//找到要插入的位置 function findPos(&$arr, $low, $high) { $target = $arr[$low]; // 将目标数存起来 while ($low < $high) { //从右向左找小于target的数 while ($low < $high && $arr[$high] > $target) { $high--; } $arr[$low] = $arr[$high]; //将arr[high]填到arr[low]中 //从左向右找大于target的数 while ($low < $high && $arr[$low] < $target) { $low++; } $arr[$high] = $arr[$low]; //将arr[low]填到arr[high]中 } $arr[$high] = $target; //此时low=high,将目标数填入这个坑中 return $high; } function quitSort(&$arr,$low,$high){ $pos = findPos($arr, $low, $high); if ($low<$pos-1){ quitSort($arr,$low,$pos-1); } if ($pos+1 < $high){ quitSort($arr,$pos+1,$high); } } $arr = [12,56,98,32,16,34,2,9,1]; $len = count($arr); quitSort($arr,0,$len-1); dump($arr);