JavaScript算法之归并排序算法(详解)


本文摘自PHP中文网,作者青灯夜游,侵删。

在本文中,我们学习 Merge Sort 背后的逻辑,并用 JavaScript 实现。最后,在空间和时间复杂度方面将归并排序与其他算法进行比较。

归并排序背后的逻辑

归并排序使用分而治之的概念对给定的元素列表进行排序。它将问题分解为较小的子问题,直到它们变得足够简单以至可以直接解决为止。

以下是归并排序的步骤:

1、将给定的列表分为两半(如果列表中的元素数为奇数,则使其大致相等)。

2、以相同的方式继续划分子数组,直到只剩下单个元素数组。

3、从单个元素数组开始,合并子数组,以便对每个合并的子数组进行排序。

4、重复第 3 步单元,直到最后得到一个排好序的数组。

以数组 [4, 8, 7, 2, 11, 1, 3] 为例,让我们看一下归并排序是如何工作的:

1.png

用 JavaScript 实现归并排序

首先实现一个将两个已排序子数组合并为一个已排序数组的函数 merge() 。要注意着两个子数组是已经被排好序的,这一点非常重要, merge() 函数只用于其进行合并。【推荐教程:《JavaScript视频教程》】

可以通过遍历这两个子数组来实现:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

function merge(left, right) {

    let arr = []

    // 如果任何一个数组为空,就退出循环

    while (left.length && right.length) {

        // 从左右子数组的最小元素中选择较小的元素

        if (left[0] < right[0]) {

            arr.push(left.shift()) 

        } else {

            arr.push(right.shift())

        }

    }

     

    // 连接剩余的元素,防止没有把两个数组遍历完整

    return [ ...arr, ...left, ...right ]

}

在这个函数中,通过把两个排好序的子数组(leftright)合并来获得一个排好序的大数组。首先,创建一个空数组。之后在 leftright 两个子数组中最小元素中的较小的一个,并将其添加到空数组。我们只需要检查 leftright 子数组中的第一个元素,因为它们是已排好序的。

阅读剩余部分

相关阅读 >>

javascript如何去掉字符串重复值

jquery中text(),html()和val()之间有何区别?

使用h5实现react拖拽排序组件的方法(附代码)

深入理解dom树和节点

js怎么比较两个字符串

css如何实现任意角度的扇形(代码示例)

javascript如何实现禁止刷新效果

node批量下载文件到本地的方法介绍(附代码)

javascript怎么执行cmd命令

10个使用console进行javascript调试的高级技巧

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...