zoukankan      html  css  js  c++  java
  • php常用算法

    注意点:大家看算法千万不要只看代码 一定一定要懂他的原理 只有原理清晰后,再结合代码,才能做到事半功倍的效果
    “约瑟夫环”是一个数学的应用问题:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,
    再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
    function ysfu($arr, $n){
    $i=0;
    while (count($arr) >= $n){
    ++$i;
    $f = array_shift($arr);
    if($i%$n != 0){
    array_push($arr, $f);
    }
    }
    return $arr;
    }


    $n = ysfu([11,52,2,6,4,3,8,9,12],3);
    var_dump($n);


    function yuesefu($n,$m) {
    $r=0;
    for($i=2; $i<=$n; $i++) {
    $r=($r+$m)%$i;
    }
    return $r+1;
    }
    echo yuesefu(10,3)."是猴王";

    //二分查找必须为有序列表 时间复杂度O(log2n)
    function halfSearch($arr, $val){
    $cnt = count($arr);
    $start = 0;
    $end = $cnt-1;
    while ($start <= $end){
    $half = ceil(($start + $end)/2);
    if($arr[$half] == $val){
    return $half;
    }elseif($arr[$half] > $val){
    $end = $half - 1;
    }elseif ($arr[$half] < $val){
    $start = $half + 1;
    }
    }
    return -1;

    }
    $n = halfSearch([1,3,6,7,8,9,11,15,17,29,30,31,32,33,34,35,44,41,42,43,44,45,46,50], 30);
    var_dump($n);

    //顺序查找 时间复杂度O(n)
    function sortSearch($arr, $val){
    $flag = false;
    $exist = -2;
    foreach ($arr as $k => $v){
    if($v == $val){
    $flag = true;
    break;
    }
    }

    if($flag == false){
    return -1;
    }else{
    return true;
    }
    }

    $n = sortSearch([1,3,6,7,8,9,11,15,17,29,30,31,32,33,34,35,44,41,42,43,44,45,46,50], 30);
    var_dump($n);


    //冒泡排序 时间复杂度O(n^2)  思路就是一组一组数字(相邻的两个数)比较,如果大于后面的数字就发生交换,这样比较完的结果就是会把最大的数移动到最后的位置
    function maoPao($arr){
    $cnt = count($arr);
    for ($i=0;$i<=($cnt-1);$i++){
    $flag = 1;
         //对于一个长度为N的数组,我们需要排序 N-1 轮,每 i 轮 要比较 N-i 次 
    for ($j=0;$j<($cnt-1-$i);$j++){
    if($arr[$j] > $arr[$j+1]){
    $flag = 0;
    $tmp = $arr[$j];
    $arr[$j] = $arr[$j+1];
    $arr[$j+1] = $tmp;
    }
    }
    if($flag){
    //证明数组有序 不需要循环
    break;
    }
    }
    return $arr;
    }


    $n = maoPao([1,50,2,6,4,3,8,9,12]);
    var_dump($n);
    //冒泡的第二种思路 这个没经过实践  大家可以看看思路 
    第一轮交换的过程:拿数组的第一位-2跟5比,发现没有我小,跳过,拿-2跟3比,发小没有我小跳过...
    拿-2跟-3比的时候,发小比我还小,两个交换下位置,下次循环的时候数组第一位已经发生了变化,是-3。嗯,仔细想想
    然后循环还没完,继续拿数组的第一位(-3),跟数组最后一位-4比较,又交换下位置...
    $numbers = array(-2, 5, 3, 1, -3, -4); for ($i=0;$i<count($numbers);$i++) { for ($j=$i+1;$j<count($numbers);$j++) { if ($numbers[$i] > $numbers[$j]) { $tmp = $numbers[$i]; $numbers[$i] = $numbers[$j]; $numbers[$j] = $tmp; } } // var_dump($numbers); } var_dump($numbers);exit;

    //选择排序 原理非常类似上面的第二种冒泡排序 不过略有差别
    function xuanz($arr){
    $tmp = 0;
    $cnt = count($arr);
    for ($i=0;$i<=($cnt-1);$i++){
    $min = $i;
    for ($j = $i + 1; $j<$cnt;$j++){
    if($arr[$i] > $arr[$j]){
    $min = $j;
    }
    }

    if($i != $min){
    $tmp = $arr[$i];
    $arr[$i] = $arr[$min];
    $arr[$min] = $tmp;
    }

    }
    return $arr;
    }


    $n = xuanz([1,50,2,6,4,3,8,9,12]);
    var_dump($n);

    //插入排序法思路:将要排序的元素插入到已经 假定排序号的数组的指定位置。

    function insert_sort($arr){
        $cnt = count($arr);
    for ($i=1; $i < $cnt; $i++){
    $tmp = $arr[$i];
    for ($j = $i - 1; $j>=0; $j--){
    if($tmp < $arr[$j]){
    $arr[$j + 1] = $arr[$j];
    $arr[$j] = $tmp;
    }else{
    break;
    }
    }
    }
    return $arr;
    }

    $n = insert_sort([1,50,2,6,4,3,8,9,12]);
    var_dump($n);



    参考链接: http://www.cnblogs.com/shen-hua/p/5422676.html
         https://www.cnblogs.com/toxiaonan/archive/2017/11/29/7920757.html
         http://blog.csdn.net/guowenwen_0416/article/details/52778782






    疯子在左,天才在右
  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/zilixiang/p/8470155.html
Copyright © 2011-2022 走看看