php常用算法

许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。

冒泡排序算法

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。

php 复制代码
/**
 * @param $arr
 * @return mixed
 *
 * 冒泡排序算法的原理如下(效率比较低):
 * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
 * 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
 * 3.针对所有的元素重复以上的步骤,除了最后一个。
 * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
 */
   function bubble($arr)
   {
        if (!is_array($arr)) {
            return '参数必须是一个一维数组';
        }
        $len = count($arr);

        //获取 长度
        $len = count($arr);
        //循环比较(相邻的两个元素,比较,交换)
        for ($k = 0; $k <= $len; $k++) {
            for ($j = $len - 1; $j > $k; $j--) {
                //比较
                if ($arr[$j] < $arr[$j - 1]) {
                    //交换
                    $temp = $arr[$j];
                    $arr[$j] = $arr[$j - 1];
                    $arr[$j - 1] = $temp;
                }
            }
        }
        return $arr;
    }
 
// 先定义一个数组
$arr = ['9', '2', '4', '1', '7', '3', '5', '8'];
$fun = bubble($arr);
var_dump($fun);

插入排序算法

插入排序的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在一排序序列中从后向前扫描,找到相应的位置并插入。

php 复制代码
 /**
 * @param $arr
 * @return mixed
 *
 * 插入排序算法的原理如下:
 * 1.从第一个元素开始,该元素可以认为已经被排序。
 * 2.取出下一个元素,在已经排序的元素序列中从后向前扫描。
 * 3.如果该元素(已排序)大于新元素,将该元素移到下一个位置。
 * 4.重复步骤 ③,直到找打已排序的元素小于或者等于新元素的位置。
 * 5.将新元素插入到该位置中。
 * 6.重复步骤2
 */
function insert_sort($arr){
 
    $len=count($arr);
 
    for($i=1; $i<$len; $i++) {
 
        //获得当前需要比较的元素值。
        $tmp = $arr[$i];
 
        //内层循环控制 比较 并 插入
        for($j=$i-1; $j>=0; $j--) {
 
            //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
            if($tmp < $arr[$j]) {
 
                //发现插入的元素要小,交换位置
                //将后边的元素与前面的元素互换
                $arr[$j+1] = $arr[$j];
 
                //将前面的数设置为 当前需要交换的数
                $arr[$j] = $tmp;
            } else {
                //如果碰到不需要移动的元素
                //由于是已经排序好是数组,则前面的就不需要再次比较了。
                break;
            }
        }
    }
    //将这个元素 插入到已经排序好的序列内。
    //返回
    return $arr;
 
}

$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(insert_sort($arr));

选择排序算法

选择排序是一种简单直观的排序算法。它的工作原理如下:首先是在末排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从 剩余未排序元素中继续寻找最小元素。然后放到排序序列末尾。以此类推,直到所有元素均排序完成。

php 复制代码
 /**
 * @param $arr
 * @return mixed
 *
 * 选择排序算法的原理如下(比冒泡效率高):
 * 1.外层决定循环层数
 * 2.选择排序就是默认当前值为最小值,记录下标,然后进行循环比较,记录最小(最大)值的下标,最后交换两者的值。这样第一个值就是最小(最大)值。
 * 3.然后,依次,循环下去。最后得到的就是有序的数组
 */
function select_sort($arr) {
 
    //$i 当前最小值的位置, 需要参与比较的元素
    for($i=0, $len=count($arr); $i<$len-1; $i++) {
 
        //先假设最小的值的位置
        $p = $i;
 
        //$j 当前都需要和哪些元素比较,$i 后边的。
        for($j=$i+1; $j<$len; $j++) {
 
            //$arr[$p] 是 当前已知的最小值
            if($arr[$p] > $arr[$j]) {
 
                //比较,发现更小的,记录下最小值的位置;并且在下次比较时,应该采用已知的最小值进行比较。
                $p = $j;
            }
        }
 
        //已经确定了当前的最小值的位置,保存到$p中。
        //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
 
    //返回最终结果
    return $arr;
}


$arr=array(1,43,54,62,21,66,32,78,36,76,39);
print_r(select_sort($arr));
 

快速排序算法

快速排序是由东尼·霍尔发展的一种排序算法。在平均状况下 ,排序n个项目要O(n log n)次比较。

php 复制代码
/**
 * @param $arr
 * @return array
 *
 * 快速排序算法原理如下:
 *  1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边
 *  2.继续递归用相同的方式来排序左边和右边
 *  3.最后合并数组
 */

function quick_sort($arr) {  
    //先判断是否需要继续进行  
    $length = count($arr);  
    if($length <= 1) {  
        return $arr;  
    }  
    //如果没有返回,说明数组内的元素个数 多余1个,需要排序  
    //选择一个标尺  
    //选择第一个元素  
    $base_num = $arr[0];  
    //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内  
    //初始化两个数组  
    $left_array = array();//小于标尺的  
    $right_array = array();//大于标尺的  
    for($i=1; $i<$length; $i++) {  
        if($base_num > $arr[$i]) {  
            //放入左边数组  
            $left_array[] = $arr[$i];  
        } else {  
            //放入右边  
            $right_array[] = $arr[$i];  
        }  
    }  
    //再分别对 左边 和 右边的数组进行相同的排序处理方式  
    //递归调用这个函数,并记录结果  
    $left_array = quick_sort($left_array); 
    $right_array = quick_sort($right_array);  
    //合并左边 标尺 右边  
    return array_merge($left_array, array($base_num), $right_array); 
}
$arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
$res = quick_sort($arr);  
print_r($res);die;
相关推荐
007php0072 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
xiaoshiguang33 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡3 小时前
【C语言】判断回文
c语言·学习·算法
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos4 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习4 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc5 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法