排序算法之 - 归并排序 php

10 篇文章 0 订阅
5 篇文章 0 订阅

1.描述

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度。代价是需要额外的内存空间。

2.逻辑

将数据分为两段,从两段中逐个选最小的元素移入新数据的开头。

1、将数组以某个值为中间点,分割为左右两部分
2、将左右数组在递归的进行第一步,直至数组长度为1,不可分割,返回数组
3、依次将返回的数组排序为有序数组,排序完成
在这里插入图片描述

3.代码

function mergeSort($arr)
{
    $arrSize = count($arr);
    //如果数组不够分割,则返回,递归到底了
    if ($arrSize <= 1) {
        return $arr;
    }
    $middle = floor($arrSize / 2);
    //将数组以某个数为点,分割成左右两部分,并递归进行,直到数组单位长度为1
    $left = array_slice($arr, 0, $middle);
    $right = array_slice($arr, $middle);
    $left = mergeSort($left);
    $right = mergeSort($right);
    //将递归返回的数组合并为有序数组
    return change($left, $right);
}
//将两个有序数组进行排序
function change($arrA, $arrB)
{
    $arrC = [];
    while (count($arrA) && count($arrB)) {
    	//总是取出较小的一个放入数组C中,直到A或B有一个数组为空
        $arrC[] = $arrA[0] < $arrB[0] ? array_splice($arrA, 0, 1)[0] : array_splice($arrB, 0, 1)[0];
    }
    return array_merge($arrC, $arrA, $arrB);
}
var_dump(mergeSort($arr));
//array(10) { [0]=> int(8) [1]=> int(15) [2]=> int(20) [3]=> int(22) [4]=> int(29) [5]=> int(49) [6]=> int(50) [7]=> int(50) [8]=> int(100) [9]=> int(101) }
[8, 15, 20, 22, 29, 49, 50, 50, 100, 101];  

附上连接

菜鸟教程《十大编程算法助程序员走上高手之路》https://www.runoob.com/w3cnote/the-friendship-algorithm-the-big-bang-theory.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值