• php常用算法


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

     

    冒泡排序算法

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

    1. /**
    2. * @param $arr
    3. * @return mixed
    4. *
    5. * 冒泡排序算法的原理如下(效率比较低):
    6. * 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    7. * 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    8. * 3.针对所有的元素重复以上的步骤,除了最后一个。
    9. * 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    10. */
    11. function bubble($arr)
    12. {
    13. if (!is_array($arr)) {
    14. return '参数必须是一个一维数组';
    15. }
    16. $len = count($arr);
    17. //获取 长度
    18. $len = count($arr);
    19. //循环比较(相邻的两个元素,比较,交换)
    20. for ($k = 0; $k <= $len; $k++) {
    21. for ($j = $len - 1; $j > $k; $j--) {
    22. //比较
    23. if ($arr[$j] < $arr[$j - 1]) {
    24. //交换
    25. $temp = $arr[$j];
    26. $arr[$j] = $arr[$j - 1];
    27. $arr[$j - 1] = $temp;
    28. }
    29. }
    30. }
    31. return $arr;
    32. }
    33. // 先定义一个数组
    34. $arr = ['9', '2', '4', '1', '7', '3', '5', '8'];
    35. $fun = bubble($arr);
    36. var_dump($fun);

    插入排序算法

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

    1. /**
    2. * @param $arr
    3. * @return mixed
    4. *
    5. * 插入排序算法的原理如下:
    6. * 1.从第一个元素开始,该元素可以认为已经被排序。
    7. * 2.取出下一个元素,在已经排序的元素序列中从后向前扫描。
    8. * 3.如果该元素(已排序)大于新元素,将该元素移到下一个位置。
    9. * 4.重复步骤 ③,直到找打已排序的元素小于或者等于新元素的位置。
    10. * 5.将新元素插入到该位置中。
    11. * 6.重复步骤2
    12. */
    13. function insert_sort($arr){
    14. $len=count($arr);
    15. for($i=1; $i<$len; $i++) {
    16. //获得当前需要比较的元素值。
    17. $tmp = $arr[$i];
    18. //内层循环控制 比较 并 插入
    19. for($j=$i-1; $j>=0; $j--) {
    20. //$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
    21. if($tmp < $arr[$j]) {
    22. //发现插入的元素要小,交换位置
    23. //将后边的元素与前面的元素互换
    24. $arr[$j+1] = $arr[$j];
    25. //将前面的数设置为 当前需要交换的数
    26. $arr[$j] = $tmp;
    27. } else {
    28. //如果碰到不需要移动的元素
    29. //由于是已经排序好是数组,则前面的就不需要再次比较了。
    30. break;
    31. }
    32. }
    33. }
    34. //将这个元素 插入到已经排序好的序列内。
    35. //返回
    36. return $arr;
    37. }
    38. $arr=array(1,43,54,62,21,66,32,78,36,76,39);
    39. print_r(insert_sort($arr));

    选择排序算法

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

    1. /**
    2. * @param $arr
    3. * @return mixed
    4. *
    5. * 选择排序算法的原理如下(比冒泡效率高):
    6. * 1.外层决定循环层数
    7. * 2.选择排序就是默认当前值为最小值,记录下标,然后进行循环比较,记录最小(最大)值的下标,最后交换两者的值。这样第一个值就是最小(最大)值。
    8. * 3.然后,依次,循环下去。最后得到的就是有序的数组
    9. */
    10. function select_sort($arr) {
    11. //$i 当前最小值的位置, 需要参与比较的元素
    12. for($i=0, $len=count($arr); $i<$len-1; $i++) {
    13. //先假设最小的值的位置
    14. $p = $i;
    15. //$j 当前都需要和哪些元素比较,$i 后边的。
    16. for($j=$i+1; $j<$len; $j++) {
    17. //$arr[$p] 是 当前已知的最小值
    18. if($arr[$p] > $arr[$j]) {
    19. //比较,发现更小的,记录下最小值的位置;并且在下次比较时,应该采用已知的最小值进行比较。
    20. $p = $j;
    21. }
    22. }
    23. //已经确定了当前的最小值的位置,保存到$p中。
    24. //如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
    25. if($p != $i) {
    26. $tmp = $arr[$p];
    27. $arr[$p] = $arr[$i];
    28. $arr[$i] = $tmp;
    29. }
    30. }
    31. //返回最终结果
    32. return $arr;
    33. }
    34. $arr=array(1,43,54,62,21,66,32,78,36,76,39);
    35. print_r(select_sort($arr));

    快速排序算法

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

    1. /**
    2. * @param $arr
    3. * @return array
    4. *
    5. * 快速排序算法原理如下:
    6. * 1.通过设置一个初始中间值,来将需要排序的数组分成3部分:小于中间值的左边,中间值,大于中间值的右边
    7. * 2.继续递归用相同的方式来排序左边和右边
    8. * 3.最后合并数组
    9. */
    10. function quick_sort($arr) {
    11. //先判断是否需要继续进行
    12. $length = count($arr);
    13. if($length <= 1) {
    14. return $arr;
    15. }
    16. //如果没有返回,说明数组内的元素个数 多余1个,需要排序
    17. //选择一个标尺
    18. //选择第一个元素
    19. $base_num = $arr[0];
    20. //遍历 除了标尺外的所有元素,按照大小关系放入两个数组内
    21. //初始化两个数组
    22. $left_array = array();//小于标尺的
    23. $right_array = array();//大于标尺的
    24. for($i=1; $i<$length; $i++) {
    25. if($base_num > $arr[$i]) {
    26. //放入左边数组
    27. $left_array[] = $arr[$i];
    28. } else {
    29. //放入右边
    30. $right_array[] = $arr[$i];
    31. }
    32. }
    33. //再分别对 左边 和 右边的数组进行相同的排序处理方式
    34. //递归调用这个函数,并记录结果
    35. $left_array = quick_sort($left_array);
    36. $right_array = quick_sort($right_array);
    37. //合并左边 标尺 右边
    38. return array_merge($left_array, array($base_num), $right_array);
    39. }
    40. $arr = array(1,98,5,34,23,87,54,23,12,0,456,123,45);
    41. $res = quick_sort($arr);
    42. print_r($res);die;

  • 相关阅读:
    代码随想录算法训练营第60天|739. 每日温度、496.下一个更大元素 I
    kafka的工作原理与常见问题
    grafana二次启动失败
    强化深度学习中使用Dyna-Q算法确定机器人问题中不同规划的学习和策略实战(超详细 附源码)
    运算放大器正反馈负反馈判别法
    网络安全(黑客)自学
    Hive面试题系列第四题-Pv累加趋势图问题
    python科研绘图:绘制X-bar图
    python期末复习案例
    Go语言基础入门
  • 原文地址:https://blog.csdn.net/qq_20869933/article/details/132767566