php实现并归排序

原创 2017年12月11日 15:11:08

废话不多说,上完整代码:

<?php
/**
 * Created by PhpStorm.
 * User: KeenSting
 * Date: 2017/12/7
 * Time: 下午5:47
 * Name: 梁小苍
 * Phone: 13126734215
 * QQ: 707719848
 * File Description: 并归排序(分治与递归)
 */


//测试类
class ATest{
    private $data;
    public function __construct($data)
    {
        $this->init($data);
    }

    //执行
    public function run()
    {
        $this->merge();
        print_r($this->data);
    }
    //初始化并归数组,相邻两个元素合并为一个数组
    private function init($data)
    {
        $tmp = [];
        $num = count($data);
        if($num%2==0)
            $items = $num/2;
        else
            $items = ($num-1)/2;
        for($i=0;$i<$items;$i++)
        {
            if($data[2 * $i] < $data[2 * $i + 1])
                array_push($tmp,[$data[2 * $i],$data[2 * $i + 1]]);
            else
                array_push($tmp,[$data[2 * $i + 1],$data[2 * $i]]);

        }
        if($num%2!=0)
            array_push($tmp,[$data[$num-1]]);

        $this->data = $tmp;
    }

    //并归递归调用
    private function merge()
    {
        $re = [];
        $size = count($this->data);
        if($size!=1)//没有完成并归,继续
        {
            for($i=0;$i<$size-1;$i+=2)
                 $re[] = $this->doubleMerge($this->data[$i],$this->data[$i+1]);
            if($size%2 != 0)
                $re[] = $this->data[$size-1];
            $this->data = $re;
            $this->merge();
        }
    }

    //合并两个有序序列
    private function doubleMerge($a,$b)
    {
        $re = [];
        $i = $j = 0;
        $s1 = count($a);
        $s2 = count($b);

        while(true)
        {
            if($a[$i] <= $b[$j])
            {
                array_push($re,$a[$i]);
                $i++;
            }else
            {
                array_push($re,$b[$j]);
                $j++;
            }

            if($i==$s1)
                return array_merge($re, array_slice($b, $j));

            if($j==$s2)
                return array_merge($re, array_slice($a, $i));

        }

    }
}

$a = new ATest([3,1,9,2,7,6,11,5,4,13]);
$a->run();

运行结果如下:

Array

(

    [0] => Array

        (

            [0] => 1

            [1] => 2

            [2] => 3

            [3] => 4

            [4] => 5

            [5] => 6

            [6] => 7

            [7] => 9

            [8] => 11

            [9] => 13

        )


)


PHP实现归并排序(合并排序)--算法原理分析

归并排序:时间复杂度为~O(nlogn)—又称合并排序 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序...
  • dalaoadalaoa
  • dalaoadalaoa
  • 2015年10月18日 17:56
  • 3225

PHP实现排序算法----归并排序(Merging Sort)

基本思想:归并排序:就是利用归并(合并)的思想实现的排序方法。它的原理是假设初始序列含有 n 个元素,则可以看成是 n 个有序的子序列,每个子序列的长度为 1,然后两两归并,得到 ⌈ n / 2⌉ (...
  • baidu_30000217
  • baidu_30000217
  • 2016年11月27日 13:47
  • 2274

php 无限分类递归及其排序详细解读

在各种栏目以及分类设置中,无限分类经常会被用到,而无限分类在进行排序的时候必然要用到递归,这里进行一次详细的分析解读。 首先我们先了解一下递归函数: 递归函数在语言学习的时候会单独拿出来学习,因为...
  • belen_xue
  • belen_xue
  • 2017年03月04日 17:14
  • 1760

php+ajax实现多图上传-拖拽排序-不同尺寸裁切-添加水印demo

  • 2017年08月21日 13:41
  • 433KB
  • 下载

PHP实现商品按销量价格升降序排序

  • 2017年12月29日 14:52
  • 47KB
  • 下载

php 无限分类递归及其排序详细解读

在各种栏目以及分类设置中,无限分类经常会被用到,而无限分类在进行排序的时候必然要用到递归,这里进行一次详细的分析解读。 首先我们先了解一下递归函数: 递归函数在语言学习的时候会单独拿出来学习,因为...
  • belen_xue
  • belen_xue
  • 2017年03月04日 17:14
  • 1760

PHP实现冒泡、选择、插入和快速排序

  • u014717777
  • u014717777
  • 2016年03月01日 20:32
  • 263

PHP实现四种基本排序算法

/**  * 思路分析:在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将...
  • sinat_41233341
  • sinat_41233341
  • 2017年11月30日 22:33
  • 22

PHP实现四种基本排序算法

前提:分别用冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中的值按照从小到大的顺序进行排序。  $arr(1,43,54,62,21,66,32,78,36,76,39);   1...
  • phpduang
  • phpduang
  • 2017年02月06日 14:03
  • 92

PHP实现四种基本排序算法

许多人都说算法是程序的核心,算法的好坏决定了程序的质量。作为一个初学者,虽然很少接触到算法方面的东西。但是对于基本的排序算法还是应该掌握的,它是程序开发的必备工具。...
  • wuchengzeng
  • wuchengzeng
  • 2017年05月27日 14:44
  • 225
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php实现并归排序
举报原因:
原因补充:

(最多只允许输入30个字)