排序算法之 - 归并排序

本文介绍了归并排序的原理,该算法通过切割列表进行尽可能两等分,直到每个子列表只剩一个元素,然后自底向上通过比较和拼接将有序子列表合并,实现整个列表的排序。归并排序是一种基于分治法的排序算法,具有稳定性和较高的效率。文中还附有归并排序的执行流程示意图和实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

归并排序也有类似于快速排序的 切割 的过程,但是快速排序会选择基准值,而归并排序则直接将列表 尽可能两等分(若长度为奇数,那么有一侧会少一个元素,左侧还是右侧是无妨的)。当分割到左右两侧都只剩下一个元素的时候,分割完成,开始往上层拼接结果。拼接的大致流程是:取左右两侧队首的元素,比较两者大小,较小的先进入已排序列表。重复执行此流程,直至有一侧为空,将另一侧剩余元素直接合并到已排序列表的右侧。归并排序也是一种“分治法”,将问题分割到不可再分割的最小单元,然后开始往回执行,最终得到结果,它同样要使用递归。。以下是归并排序的执行流程示意图:

  • 归并排序执行流程及结果:
    快速排序执行流程及结果

PHP实现代码:

<?php

function merge($arrayNeedsSort)
{
   
    if (empty($arrayNeedsSort) || count($arrayNeedsSort) <= 1) {
   
        // 基准条件,退出
        return $arrayNeedsSort;
    } else {
   
        $res = [];
        $left = [];
        $right = [];

        $length = count($arrayNeedsSort);

        if ($length % 2 == 0) {
   
            // 长度为偶数,对半分
            list($left, $right) = array_chunk($arrayNeedsSort, ($length / 2));
        } else {
   
            // 长度为奇数,左侧比右侧少一
            list($left, $right, $last) = array_chunk($arrayNeedsSort, (($length - 1) / 2));
            // 切割后将剩余的一个元素补到右侧的列表末尾
            $right[] = $last[0];
        }

        // 先对左侧进行排序
        $left = merge($left);

        // 再对右侧进行排序
        $right = merge($right);

        $flag = count($left) + count($right);
        while ($flag > 0) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值