当前位置:   article > 正文

PHP 基础算法:冒泡、归并、快速_php 冒泡

php 冒泡

一、冒泡排序

1、介绍:

        冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻元素可以交换,就表明完成了排序。

2、具体步骤:

        a、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

        b、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

        c、针对所有的元素重复以上的步骤,除了最后一个。

        d、持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3、代码:

  1. /**
  2. * 冒泡排序
  3. * @param $arr
  4. * @return mixed
  5. */
  6. function arrayBubblingSort($arr) {
  7. $count = count($arr);
  8. //外层控制排序轮次
  9. for ($i = 0; $i < $count - 1; $i ++) {
  10. //内层控制每轮比较次数
  11. for ($j = 0; $j < $count - 1 - $i; $j ++) {
  12. if ($arr[$j] > $arr[$j + 1]) {
  13. $temp = $arr[$j];
  14. $arr[$j] = $arr[$j + 1];
  15. $arr[$j + 1] = $temp;
  16. }
  17. }
  18. }
  19. return $arr;
  20. }

二、归并排序

1、介绍:

        归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

2、具体步骤:

        a、申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

        b、设定两个指针,最初位置分别为两个已经排序序列的起始位置

        c、比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

        重复步骤c直到某一指针超出序列尾

        将另一序列剩下的所有元素直接复制到合并序列尾

3、代码

  1. /**
  2. * 归并排序
  3. * @param array $array
  4. * @return array
  5. */
  6. function allMergeSort($array = []) {
  7. $count = count($array);
  8. //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组
  9. if ($count <= 1) {
  10. return $array;
  11. }
  12. $mid = intval($count / 2);
  13. //拆分数组0-mid这部分给左边left_array
  14. $left_array = array_slice($array, 0, $mid);
  15. //拆分数组mid-末尾这部分给右边right_array
  16. $right_array = array_slice($array, $mid);
  17. //左边拆分完后开始递归合并往上走
  18. $left_array = allMergeSort($left_array);
  19. //右边拆分完毕开始递归往上走
  20. $right_array = allMergeSort($right_array);
  21. //合并两个数组,继续递归
  22. $return_array = mergeSort($left_array, $right_array);
  23. return $return_array;
  24. }
  25. /**
  26. * @param $left_array
  27. * @param $right_array
  28. * @return array
  29. */
  30. function mergeSort($left_array, $right_array) {
  31. $return_array = [];
  32. while (count($left_array) && count($right_array)) {
  33. $return_array[] = $left_array[0] < $right_array[0] ? array_shift($left_array) : array_shift($right_array);
  34. }
  35. return array_merge($return_array, $left_array, $right_array);
  36. }

三、快速排序

1、介绍:

        设要排序的数组是A[0]……A[N-1],⾸先任意选取⼀个数据(通常选⽤数组的第⼀个数)作为关键数据,然后将所有⽐它⼩的数都放到它左边,所有⽐它⼤的数都放到它右边,这个过程称为⼀趟快速排序。值得注意的是,快速排序不是⼀种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产⽣变动

2、具体步骤:

        a、在数组中选⼀个基准数(通常为数组第⼀个);
        b、将数组中⼩于基准数的数据移到基准数左边,⼤于基准数的移到右边;
        c、对于基准数左、右两边的数组,不断重复以上两个过程,直到每个⼦集只有⼀个元素,即为全部有序。

3、代码

  1. /**
  2. * 数组快速排序
  3. * @param $array
  4. * @return bool|array
  5. */
  6. function arrayQuickSort($array) {
  7. if (!is_array($array))
  8. return false;
  9. if (count($array) > 1) {
  10. $left = $right = [];
  11. for ($i = 1; $i < count($array); $i ++) {
  12. if ($array[$i] <= $array[0]) {
  13. $left[] = $array[$i];
  14. } else {
  15. $right[] = $array[$i];
  16. }
  17. }
  18. $left = arrayQuickSort($left);
  19. $right = arrayQuickSort($right);
  20. return array_merge($left, [$array[0]], $right);
  21. } else {
  22. return $array;
  23. }
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/475721
推荐阅读
相关标签
  

闽ICP备14008679号