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






    疯子在左,天才在右
  • 相关阅读:
    实现斐波那契数列的三种方式
    [LintCode]计算两个数的交集(二)
    [LintCode]计算两个数的交集(一)
    JNI技术概念小结
    require.js的用法
    JavaScript中模块“写法”
    模块化的JavaScript
    javascript如何判断访问网页的设备及是否支持触屏功能
    Javascript自由拖拽类
    JQuery中html()方法的注意事项
  • 原文地址:https://www.cnblogs.com/zilixiang/p/8470155.html
Copyright © 2011-2022 走看看