php实现归并排序算法

Posted 程序员的碎碎念

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php实现归并排序算法相关的知识,希望对你有一定的参考价值。

理解

归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法。 如 设有数列{6,202,100,301,38,8,1} 初始状态:6,202,100,301,38,8,1 第一次归并后:{6,202},{100,301},{8,38},{1},比较次数:3; 第二次归并后:{6,100,202,301},{1,8,38},比较次数:4; 第三次归并后:{1,6,8,38,100,202,301},比较次数:4; 总的比较次数为:3+4+4=11; 逆序数为14; 归并排序是稳定的排序,速度仅次于快速排序

代码实现

 
   
   
 
  1. <?php

  2. /**

  3. * Created by PhpStorm.

  4. * User: benny

  5. * Date: 18-12-2

  6. * Time: 上午9:42

  7. */

  8. /**

  9. * 归并排序

  10. * @param array $array

  11. * @return array

  12. *

  13. */

  14. function all_merge_sort($array=[]){

  15.    $count = count($array);

  16.    //递归结束条件,到达这步的时候,数组就只剩下一个元素了,也就是分离了数组

  17.    if ($count<=1){

  18.        return $array;

  19.    }

  20.    $mid = intval($count/2);

  21.    //拆分数组0-mid这部分给左边left_array

  22.    $left_array = array_slice($array,0,$mid);

  23.    //拆分数组mid-末尾这部分给右边right_array

  24.    $right_array = array_slice($array,$mid);

  25.    //左边拆分完后开始递归合并往上走

  26.    $left_array = all_merge_sort($left_array);

  27.    //右边拆分完毕开始递归往上走

  28.    $right_array = all_merge_sort($right_array);

  29.    //合并两个数组,继续递归

  30.    $return_array = merge_sort($left_array,$right_array);

  31.    return $return_array;

  32. }

  33. /**

  34. * @param $left_array

  35. * @param $right_array

  36. * @return array

  37. *

  38. * merge函数将指定的两个有序数组(arr1,arr2)合并并且排序

  39. 我们可以找到第三个数组,然后依次从两个数组的开始取数据哪个数据小就先取哪个的,然后删除掉刚刚取过///的数据

  40. */

  41. function merge_sort($left_array,$right_array){

  42.    $return_array = [];

  43.    while (count($left_array) && count($right_array)){

  44.        //这里不断的判断哪个值小,就将小的值给到arrC,但是到最后肯定要剩下几个值,

  45.        //不是剩下arrA里面的就是剩下arrB里面的而且这几个有序的值,肯定比arrC里面所有的值都大所以使用

  46.        $return_array[] = $left_array[0] < $right_array[0] ? array_shift($left_array): array_shift($right_array);

  47.    }

  48.    return array_merge($return_array,$left_array,$right_array);

  49. }

  50. $array=[12,5,4,32,56,87,4,11,2,0];

  51. print_r(json_encode(all_merge_sort($array)));




今日作者: benny

不会UI的前端不是好后端

以上是关于php实现归并排序算法的主要内容,如果未能解决你的问题,请参考以下文章

[PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现

排序之归并排序的算法思想及实现代码

排序算法之归并排序

php常用的排序算法与二分法查找

归并排序-PHP版

[ 数据结构 -- 手撕排序算法第六篇 ] 归并排序(上)--递归方法实现