快速排序
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);
浙公网安备 33010602011771号