快速排序

1、原理:

找到当前数组中的任意一个元素(一般选择第一个元素),作为标准,新建两个空数组,遍历整个数组元素,

如果遍历到的元素比当前的元素要小,那么就放到左边的数组,否则放到右面的数组,然后再对新数组进行同样的操作

2、递归:

程序调用自身的编程技巧称为递归。

  1. 递归必须要有边界条件,也就是递归出口(退出递归)
  2. 递归前进段和递归返回段,也就是最后得到的值
  3. 当边界条件不满足时,递归前进;当边界条件(递归出口)满足时,递归返回

例子:

递归计算阶乘:

<?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);

  

posted @ 2019-03-16 14:17  诸城布拉德皮特  阅读(130)  评论(0编辑  收藏  举报